debugging 如何在C++中计算一个国家多年后的人口?

xzabzqsa  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(170)

设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;
}

我认为这很简单,但我不知道为什么我的代码不工作。

ercv8c1e

ercv8c1e1#

你的代码实际上是“工作”的,* 如果 *:
1.初始人口足够大,每年至少增加一个人,
1.你 * 想 * 截断任何部分人口增长的一年,而不是保留他们,直到他们加起来一个完整的人。
如果一个最初有99人的人口以每年1%的速度增长,你会看到它永远不会增长,因为nint,因此丢弃了每年增加的人口的小数部分(每年四舍五入,而不是四舍五入,或者保留小数部分,以便在以后的一年中增加一个人)。
如果初始人口为1000人,10年内以2%的速度增长,那么10年后你会得到一个半合理的答案1214人。

#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;
}

在线试用!
也就是说,相对于通常计算人口增长的方式,它是低的。如果你保留部分人口,只在最后四舍五入一次,例如,将nm改为double(或float,精度较低),您将得到最终答案1219而不是1214,根据1000 * 1.02 ** 10的更简单的一体化计算,(得到1218.99442,四舍五入为1219),你可以在C++中使用std::pow而不是手写的循环来实现,并将得到(可能)更小的错误和更高的性能的答案,将整个循环替换为:

n *= std::pow(1 + m/100.0, k);

简而言之:
1.重复舍入(尤其是重复 * 截断 *)通常是一个坏主意,因为它会将小错误合并为更大的错误,
1.如果您可以将执行小型浮点操作的循环替换为单个批量浮点操作,则运行速度会更快,浮点精度损失也会更少

相关问题