C语言中的可变范围

时间:2019-02-19 18:56:15

标签: c initialization

我试图找出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;
}

1 个答案:

答案 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)引用了一个未定义的变量。