我正在处理一项涉及“相当不错”的数字的作业。该任务将它们描述为:
“一个“相当不错”的数字是一个整数,它的“坏度”——它的除数之和与数字本身之差的大小——不大于一个指定的值。例如,如果最大坏度是设置为 3,有 12 个“相当不错”的数字小于 100:2、3、4、6、8、10、16、18、20、28、32 和 64;你的任务是编写一个 C++ 程序,非常好,它确定小于指定值的指定最大 badness 的数量。在执行程序时,将限制值和最大 badness 指定为命令行参数。”
该任务要求我编写一个程序,该程序可以打印具有高达一百万的指定坏度限制的完美数字。所以,相当好的 1000000 的命令行参数 1 应该打印 2 4 6 8 16 28 32 64 128 256 496 512 1024 2048 4096 8128 8192 16384 32768 65536 131072 262144 524288。
我已经得到了这个与以下代码一起工作
#include <iostream>
using namespace std;
int main(int argc,char *argv[]) {
const int limit = argc > 1 ? atoi(argv[1]) : 1000000;
const int badness = argc > 2 ? atoi(argv[2]) : 10;
for(int number = 2; number < limit; number++) {
int sum = 1;
for (int factor = 2; factor < number; factor++){
if (number % factor == 0) {
sum += factor;
}
}
if (number >= (sum - badness) && number <= (sum + badness)) {
cout << number << " ";
}
}
return 0;
}
唯一的问题是,这段代码在找到高达 100 万的“相当不错”的数字时太慢了。有没有办法优化这个?
谢谢