我正在尝试生成0到999之间的所有阿姆斯壮数字。如果我删除程序底部的sum=0;
语句(第22行),我不明白为什么我的代码不起作用。
#include<stdio.h>
#include<conio.h>
int main()
{
int i, n=999, rem, num, sum=0;
for(i=0; i<n; i++)
{
num=i;
while(num != 0)
{
rem = num%10;
num = num/10;
sum = sum+(rem*rem*rem);
}
if (sum == i)
{
printf("%d\n", sum);
}
sum=0;
}
return 0;
}
答案 0 :(得分:7)
您只是在重置和,以使for
循环的每个迭代都具有一个新的归零的sum
。
如果不执行此操作,则循环的每次迭代都会将sum
保留为前一次迭代的值,从而使求和复杂并给出错误的值!
如注释中所述,传统上更容易理解是否在循环开始时执行此操作,并且与之相结合,最好还是将变量作用域保持尽可能窄,例如 eg :
#include <stdio.h>
int main()
{
for(int i = 0; i < 999; i++)
{
int sum = 0;
int num = i;
while(num != 0)
{
int rem = num % 10;
num = num / 10;
sum = sum + (rem * rem * rem);
}
if (sum == i)
{
printf("%d\n", sum);
}
}
return 0;
}
答案 1 :(得分:2)
在for循环中,sum的首次使用是sum = sum + (rem*rem*rem);
,因此,如果您不想使用上一次迭代的sum的值,则必须在的开头将其值重置为零。 for循环的每次迭代。在代码中,您可以在for循环之前和每次迭代结束时(第22行)将其值重置为零,从而达到目的。
答案 2 :(得分:1)
阿姆斯壮数字N是单个数字的总和(例如,A,B,C),提高到数字的幂次,等于数字本身。
N = A^3 + B^3 + C^3
因此要计算0-999,需要一个循环。在循环的每次迭代中,您都需要从0重新开始求和。以循环中的i=10
和i=11
为例。阿姆斯特朗号也不是,但它们应该是:
i=10: 1^2 + 0^2 = 1
i=11: 1^2 + 1^2 = 2
在不重置sum
的情况下,您使用的是先前数字计算的结果:
i=10: 1^2 + 0^2 + 9^1 (+ 8^1 + 7^1 + ...) ≠ 1
i=11: 1^2 + 1^2 + (1^2 + 0^2 + 9^1) + ... ≠ 2