переменная область действия на языке Си - PullRequest
0 голосов
/ 19 февраля 2019

Я пытался найти совершенные числа от 1 до 500. Я пытался запустить следующую программу, но не получал желаемого результата, кроме случаев, когда я инициализировал то же самое (т. Е. Сумма)внутри цикла я получаю желаемый результат.Что это так?

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 голосов
/ 19 февраля 2019

Перемещение определения и инициализации 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) ссылается на неопределенную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...