题目:

水仙花数是指一个N位正整数(N>3),他的每个位上的数字的N次幂之和等于它本身,例如 153=1^3+5^3+3^3.本题要求编写程序,计算所有N位水仙花数。

输入格式:

 输入在一行中给出一个正整数N(3<=N<=7)

 输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

 3

输出样例:

 

153

370

371

……

 代码

#include<stdio.h>
int main()
{
    int num;
    int a = 9, b = 9;
    int k, i, x = 1, s, h, c, n;
    scanf_s("%d", &num);            //VS中需要加上 _s
    for (k = 1; k < num; k++)
    {
        b = b * 10;
        a = b + a;
    }
    printf("%d位数最大值是%d\n", num, a);
    i = (1 + a) / 10;
    for (i; i <= a; x++)        //控制数字递增
    {
        h = i;
        c = 0;                  //每个数字计算前位次幂之和为0
        n = 1;                  //每个数字计算前位数初始化
        while (n <= num)    //控制每个数字的位数递增
        {
            s = h % 10;     //分离个位数
            h = h / 10;     //丢掉个位数
            int j=1;
            int p = s;    //每个位数必须要自乘,否则若是相关联在一起,只要有一个为0,其他都是零
            while (j<num) 
            {               //将每个个位数进行位次幂
                p = p * s;
                j++;
            }
            c = c + p;      //位次幂相加
            n = n + 1;
        }
        if (c == i) {
            printf("%d是水仙花数\n", i);
        }
        i = i + 1;
    }
    return 0;
}

易错点

真的像吃了屎一样难受啊,整个水仙花数,搞了六个小时才搞定,又把题目给看错了,没看清N次幂,我以为都是3次幂(C=C+S*S*S),足足整了4小时才又去看了会题目,被自己蠢到家,这里给自己三巴掌。可能想问还有两小时是怎么回事,一个是变量初始化的位置不对,导致每次循环的时候对变量进行连加,在给自己一巴掌,另一个是我令P=1,然后P=P*S,想通过这样进行对每个数求位次幂,可这样一个数之间的几个数字相关联了,若是有一个为零,则P的最终结果肯定为0,所以应该对数字独立求幂次方,直接令P=S就行。

这个题目对我来说,还是存在很大的难度的,特别是前四个小时,把代码检查了一遍又一遍,只能算出三位数的水仙花数,差点给我整崩溃,下次再出现不看清题目,我拍视屏吃屎,中国人不骗中国人。


版权声明:本文为m0_61146840原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_61146840/article/details/124572195