gpt4 book ai didi

c - C语言中的变量作用域

转载 作者:行者123 更新时间:2023-11-30 20:18:10 24 4
gpt4 key购买 nike

我试图找出 1 到 500 之间的完美数字。我尝试运行以下程序,但没有得到所需的输出,除非我初始化相同的输出(即,sum )在 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;
}

最佳答案

移动 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)引用 undefined variable 。

关于c - C语言中的变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54773163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com