【发布时间】:2016-06-26 00:45:10
【问题描述】:
我想计算一个数字是否是一个完美的数字(sum(proper divisors)== number)。所以我所要做的就是得到正确的除数,把它们加起来,看看它是否是数字。为此,我使用了一个 for 循环:
cin >> number;
sum = 1;
for (int i = number/2; i > 1; --i) {
if (number % i == 0) {
sum = sum + i;
}
if (sum > number) {break;}
}
if (sum == number) {cout << "perfect!" << endl;}
这个循环太慢了。如您所见,我已经完成的是,如果总和已经大于数字,则跳出循环,我从更大的数字开始(因此,如果总和更大,它会更快到达那里),并且由于 1 始终是适当的除数,我不需要循环它。
现在我有点没有想法了,非常感谢一些关于如何进一步改进这个循环的提示(或者甚至是完全不同的方法?)
【问题讨论】:
-
当
number % i == 0,number % (number/i) == 0也是 -
一个可能的技巧 - 不是从
number/2开始,而是从sqrt(number)开始。注意,如果i是一个除数,那么number/i也是一个除数,所以你只需要访问两者中较小的一个。 -
@nwp 不是这样,或者至少不是微不足道的。
28=1+2+4+7+14是一个完美数,但 4 不是素数。 -
更简单的技巧是简单地硬编码所有完美数字。只有 five or six 适合 32 位 int,只有几个适合 64 位。
-
@Nils_S 就像我说的,你只需要总结
divisor和number/divisor。所以当你访问 2 时,你添加了 2 和 3。
标签: c++ loops optimization