题目:
水仙花数是指一个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 版权协议,转载请附上原文出处链接和本声明。