C++ 算法:将总值 n 分解为 m 个接近 n/m 的正数
以下是用 C++ 编写的算法,可以将给定的总值 n 分解为 m 个接近 n/m 的正数:\n\ncpp\n#include \"iostream\"\n#include \"vector\"\n#include \"random\"\n\nstd::vector<double> generateNumbers(double n, int m) {\n std::vector<double> numbers(m);\n double average = n / m;\n double remaining = n;\n \n std::random_device rd;\n std::mt19937 gen(rd());\n std::uniform_real_distribution<double> dis(0.0, average * 2);\n \n for (int i = 0; i < m - 1; i++) {\n double number = dis(gen);\n if (number > remaining) {\n number = remaining;\n }\n numbers[i] = number;\n remaining -= number;\n }\n \n numbers[m - 1] = remaining;\n return numbers;\n}\n\nint main() {\n double n;\n int m;\n \n std::cout << \"Enter the total value (n): \" ;\n std::cin >> n;\n \n std::cout << \"Enter the number of values (m): \" ;\n std::cin >> m;\n \n std::vector<double> numbers = generateNumbers(n, m);\n \n std::cout << \"Generated numbers: \" ;\n for (double number : numbers) {\n std::cout << number << \" \" ;\n }\n std::cout << std::endl;\n \n return 0;\n}\n\n\n该算法使用了 C++ 的随机数生成器来生成接近 n/m 的正数,然后将这些数相加得到 n。首先,算法计算出每个数的平均值 average。然后,使用 std::random_device 和 std::mt19937 来初始化随机数生成器,并使用 std::uniform_real_distribution 来生成 0 到 average*2 之间的随机数。接下来,算法使用循环生成 m-1 个数,每次生成的数都要小于等于剩余的数值 remaining,最后一个数直接等于剩余的数值。最后,算法将生成的数值存储在一个向量中并返回。在主函数中,用户可以输入总数值 n 和数值的数量 m,并调用 generateNumbers 函数生成数值,并将其打印出来。
原文地址: https://www.cveoy.top/t/topic/qo0K 著作权归作者所有。请勿转载和采集!