【发布时间】:2021-10-06 12:22:29
【问题描述】:
我正在处理一项涉及“相当不错”的数字的作业。该任务将它们描述为:
“一个“相当好的”数字是一个整数,其“坏度”——除数之和与数字本身之差的大小——不大于指定值。例如,如果最大坏度为设置为 3,有 12 个小于 100 的“相当不错”的数字:2、3、4、6、8、10、16、18、20、28、32 和 64;你的任务是编写一个 C++ 程序,非常好,它确定小于指定值的指定最大坏度的数量。限制值和最大坏度在程序执行时指定为命令行参数。"
任务要求我编写一个程序,打印完美数字,指定的坏数限制高达一百万。所以,相当好的命令行参数 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 万的“相当不错”的数字时速度太慢了。有什么办法可以优化吗?
谢谢
【问题讨论】:
-
为什么值集中的所有素数都
-
@fabian 他们显然在谈论适当的除数,即不包括数字本身。
-
一个数字“相当好”,类似于一个数字是“完美”的(如果 n 的除数之和不包括 n 等于 n,则 n 是完美的)。但是没有定义,从描述为工作的代码中可以清楚地看到(但太慢)。
标签: c++ algorithm c++11 math perfect-numbers