设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;
}
我认为这很简单,但我不知道为什么我的代码不工作。
1条答案
按热度按时间ercv8c1e1#
你的代码实际上是“工作”的,* 如果 *:
1.初始人口足够大,每年至少增加一个人,
1.你 * 想 * 截断任何部分人口增长的一年,而不是保留他们,直到他们加起来一个完整的人。
如果一个最初有99人的人口以每年1%的速度增长,你会看到它永远不会增长,因为
n
是int
,因此丢弃了每年增加的人口的小数部分(每年四舍五入,而不是四舍五入,或者保留小数部分,以便在以后的一年中增加一个人)。如果初始人口为1000人,10年内以2%的速度增长,那么10年后你会得到一个半合理的答案1214人。
在线试用!
也就是说,相对于通常计算人口增长的方式,它是低的。如果你保留部分人口,只在最后四舍五入一次,例如,将
n
和m
改为double
(或float
,精度较低),您将得到最终答案1219而不是1214,根据1000 * 1.02 ** 10
的更简单的一体化计算,(得到1218.99442
,四舍五入为1219
),你可以在C++中使用std::pow
而不是手写的循环来实现,并将得到(可能)更小的错误和更高的性能的答案,将整个循环替换为:简而言之:
1.重复舍入(尤其是重复 * 截断 *)通常是一个坏主意,因为它会将小错误合并为更大的错误,
1.如果您可以将执行小型浮点操作的循环替换为单个批量浮点操作,则运行速度会更快,浮点精度损失也会更少