关于水仙花的问题

#include <stdio.h>
int main ()
{
    int n;// 待读入的位数
    int valL, valH; // n位最小数 low  与  最大数  high
    int i;//循环变量
    scanf("%d" , &n);
    valL = 1;
    for(i = 1; i < n; i++)
    {
        valL = valL * 10; 
    }
    valH = valL *10;
    
    for(i = valL; i < valH; i++)
    {
        int tmp = i;//当前要检测的值; 
        int sum = 0; //和值
        do{
            int r;//余数 
            r = tmp % 10;
            int j, valmul = r;/almul为乘数
            for(j = 1; j < n; j++)
            {
                r = r * valmul; //每次乘以r 
             } 
             sum = sum + r;
             tmp = tmp /10;//去掉最后一位 
        } while(tmp > 0);
        
        if(sum == i)
        {
            printf("%d\n", i);
        }
    }
    
}

鉴于老师给的源代码,思考后自己有以下的理解

1.关于for语句部分的理解

for(i = 1; i < n; i++)
    {
        valL = valL * 10; 
    }
    valH = valL *10;
是规定i的范围,比如如果输入的n是3,则按照以下的运算,valL=100,valH=1000,则最终输出的i值是在100与1000之间的。
2.关于下面的循环嵌套部分
for(i = valL; i < valH; i++)
    {
        int tmp = i;//当前要检测的值; 
        int sum = 0; //和值
        do{
            int r;//余数 
            r = tmp % 10;
            int j, valmul = r;/almul为乘数
            for(j = 1; j < n; j++)
            {
                r = r * valmul; //每次乘以r 
             } 
             sum = sum + r;
             tmp = tmp /10;//去掉最后一位 
        } while(tmp > 0);
        
        if(sum == i)
        {
            printf("%d\n", i);
        }
    }
可以带值进去理解。
1.还是将n=3带进式中,此时的i = valL = temp,valL = 100,valH = 1000.进入do....while语句中时,r等于temp的个位数值。

2.将r带入下一个for语句中,当不满足j<n时,此时的r等于r的三次方(带入不同的n对于着不同的r次幂,因为一开始假设输入n为3,所以此时是3次幂),sum=r的三次方,因为tmp=tmp/10,
加之因为valL=100,valL=tmp,则此时的tmp=10,又因为此时的tmp是大于0的,所以继续在do....while语句中循环。

3.再一次进行循环时,和上面叙述的相同,此时在for语句输出的r为原先i十位上数字的三次幂,此时的sum已经为10位上数字的三次幂加上个位上数字的三次幂,百位上的数字也将如十位上的一
样,最后输出的sum值为百位上数值的三次幂加上十位上数值的三次幂和个位上数字的是三次幂。当tmp最后变成一位数后,因tmp/10小于1,最后跳出大循环。

4.最后检验是否sum的最终值与i相等,若相等,则输出此时的i值。
以上是个人理解,因为是第一次写这方面的东西,有什么说的不正确或理解的不到位的地方希望大家多多指教。
posted @ 2017-11-19 19:21  董雅洁  阅读(219)  评论(0编辑  收藏  举报