水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
分析:初次写完代码提交OJ发现如下的错误,在自己电脑跑了下确实花费时间很长,以为是循环过多,在尝试缩减循环后还是超时,查阅了别人写的经验贴:https://blog.csdn.net/melody_1016/article/details/82947204,发现是pow()函数调用过多导致的,然后修改了下,果然通过了。
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int N;
scanf("%d",&N);
int border_max = 0;
int border_min = 1 * pow(10,N-1);
int sum;
int temp;
//找边界
for(int i=0;i<N;i++)
{
border_max = border_max + 9 * pow(10,i);
}
//存幂值,避免pow函数调用次数过多
int p[10]={0};
for(int j=0;j<=9;j++)
{
p[j] = (int)pow(j,N);
}
//找水仙花数
for(int i=border_min;i<=border_max;i++)
{
sum = 0;
temp = i;
while(temp > 0)//第一次用的for循环,对这种长度未知的情况,while更方便简洁
{
int d = temp % 10;
sum = sum + p[d];
temp = temp / 10;
}
if(sum == i)
{
printf("%d\n",sum);
continue;
}
}
return 0;
}
结果: