水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
一开始写的超时了 主要原因是pow次数调用过多
看到csdn上面的博主写的一种方法:把输入的n次方的1-9个数字存入一个数组中,每次减一个位数就调用一次数组里面的数字
#include<stdio.h>
#include<math.h>
int N;
long int *arr1;
int select(int n);
int is_flower(long int i);
int main(void)
{
long int num;
long int arr[10];
scanf_s("%d",&num);
N = num;
for (int i = 0; i < 10; i++)
{
arr[i] = pow(i, N);
}
arr1 = arr;
long int end =select(num);
long int first=end/10;
long int i;
for(i=first;i<end;i++)
{
if(is_flower(i) == 1)
printf("%ld\n",i);
}
return 0;
}
int select(int n)
{
switch(n)
{
case 3:return 1000;
case 4:return 10000;
case 5:return 100000;
case 6:return 1000000;
case 7:return 10000000;
}
}
int is_flower(long int i)
{
int sum=0;
int t;
int temp = i;
while(i)
{
t=i%10;
sum+=arr1[t];
i=i/10;
}
if(sum==temp)
return 1;
else
return 0;
}