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