为什么需要22号线?

时间:2018-08-17 15:09:08

标签: c

我正在尝试生成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;
}

3 个答案:

答案 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=10i=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