问题 : 拓展水仙花
题目描述
有一种数字叫:水仙花数。比如:153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。
现在,有一种拓展的水仙花数。
不仅仅是每位数每位数字的3次方和了,如果这个数字总共有N位的话,则是“每位数字的N次方和”。
eg:54748=5*5*5*5*5+4*4*4*4*4+7*7*7*7*7+8*8*8*8*8+4*4*4*4*4
现在要给你一个数X。需要你给出在所有X位数中,存在的拓展水仙花数分别是什么。从小到大输出。
输入
一个数字X表示位数(x<=6)。
输出
X位数中哪些是拓展水仙花数。从小到大,每行一个
样例输入
4
样例输出
1634
8208
9474
方法一:
1 #include<stdio.h> 2 #define fr(i,n,m) for(i=n;i<m;i++) 3 int fun(int n,int m){ 4 int sum=1; 5 for(int j=0;j<n;j++){ 6 sum*=m; 7 } 8 return sum; 9 } 10 int main(){ 11 int n,a,b,i; 12 int k,sum,p; 13 scanf("%d",&n); 14 switch(n){ 15 case 1:a=1,b=10;break; 16 case 2:a=10,b=100;break; 17 case 3:a=100,b=1000;break; 18 case 4:a=1000,b=10000;break; 19 case 5:a=10000,b=100000;break; 20 case 6:a=100000,b=1000000;break; 21 } 22 fr(i,a,b){ 23 k=a; 24 p=i; 25 sum=0; 26 while(k){ 27 sum+=fun(n,p/k); 28 p=p%k; 29 k=k/10; 30 } 31 if(sum==i){ 32 printf("%d\n",i); 33 } 34 } 35 36 }
方法二:
1 #include<stdio.h> 2 #include<math.h> 3 int fun(int n,int m){ 4 int sum=1; 5 for(int j=0;j<n;j++){ 6 sum*=m; 7 } 8 return sum; 9 } 10 int main(){ 11 int a,b,n,sum,p; 12 scanf("%d",&n); 13 for(int i=pow(10,n-1);i<pow(10,n);i++){ 14 a=pow(10,n-1); 15 p=i; 16 sum=0; 17 while(a){ 18 sum+=fun(n,p/a); 19 p=p%a; 20 a=a/10; 21 } 22 if(sum==i){ 23 printf("%d\n",i); 24 } 25 } 26 27 }