如何用C++计算多年后国家人口?代码运行异常求助
人口增长计算代码故障排查
已知某国初始人口为n,每年增长率为m%,求k年后的人口(取整结果)。我写了下面的代码,但无法正常运行,求解决办法:
#include <iostream> #include <cmath> using namespace std; int main() { int n, k; float m; cin >> n >> m >> k; for (int i = 1; i <= k; i++) { n += n * (m / 100); } int x = round(n); cout << x << endl; return 0; }
问题根源
n是int类型,每次循环计算n += n*(m/100)时,小数部分会被直接截断丢弃,导致复利计算完全失真。比如初始人口101、增长率3%时,第一年实际应为104.03,但用int存储会直接变成104,后续所有计算都基于这个错误的整数,误差会越来越大。round(n)完全无效,因为n本身就是int类型,不存在小数需要四舍五入。
修正方案
把存储人口的变量换成浮点数类型(比如double),保留每次增长的小数部分,最后再取整:
#include <iostream> #include <cmath> using namespace std; int main() { int n, k; float m; cin >> n >> m >> k; double population = n; for (int i = 1; i <= k; i++) { population += population * (m / 100); } int x = round(population); cout << x << endl; return 0; }
或者用复利公式直接计算,效率更高:
#include <iostream> #include <cmath> using namespace std; int main() { int n, k; float m; cin >> n >> m >> k; double population = n * pow(1 + m / 100.0, k); int x = round(population); cout << x << endl; return 0; }
内容的提问来源于stack exchange,提问作者pda
相关产品推荐
相关产品推荐

