我试图找出1到500之间的完美数字。我正在尝试运行以下程序,但是除了初始化时(如求和),我没有得到所需的输出。 )在for循环中,我正在获得所需的输出。怎么了?
int main() {
int sum = 0;
for (int num = 1; num <= 500; ++num) {
for (int i = 1; i < num; ++i) {
if (num % i == 0) {
sum = sum + i;
}
}
if (sum == num) {
printf("%d, ", num);
}
}
return 0;
}
答案 0 :(得分:1)
在外部循环体内移动sum
的定义和初始化会很好。 sum
将在每次迭代开始时重新初始化。
请注意,您可以通过以下方式减少此函数的时间复杂度:
#include <stdio.h>
int main() {
for (int num = 1; num <= 100000; ++num) {
int i, sum = 1;
for (i = 2; i * i < num; ++i) {
if (num % i == 0) {
sum += i + num / i;
}
}
if (i * i == num) {
sum += i;
}
if (sum == num) {
printf("%d, ", num);
}
}
printf("\n");
return 0;
}
定时输出(num <= 100000
):
1, 6, 28, 496, 8128,
real 0m0.075s
user 0m0.070s
sys 0m0.002s
原始代码:
6, 28, 496, 8128,
real 0m15.582s
user 0m15.249s
sys 0m0.067s
编辑:如果通过将和放入循环,则表示编写for (int i = 1, sum = 0; i < num; ++i) {
不会编译,因为sum
仅在for
语句中定义,因此测试if (sum == num)
引用了一个未定义的变量。