二十一:拓展水仙花
程序员文章站
2024-03-18 13:09:52
...
问题 : 拓展水仙花
题目描述
有一种数字叫:水仙花数。比如: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
题目描述
有一种数字叫:水仙花数。比如: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
方法一:
#include<stdio.h>
#define fr(i,n,m) for(i=n;i<m;i++)
int fun(int n,int m){
int sum=1;
for(int j=0;j<n;j++){
sum*=m;
}
return sum;
}
int main(){
int n,a,b,i;
int k,sum,p;
scanf("%d",&n);
switch(n){
case 1:a=1,b=10;break;
case 2:a=10,b=100;break;
case 3:a=100,b=1000;break;
case 4:a=1000,b=10000;break;
case 5:a=10000,b=100000;break;
case 6:a=100000,b=1000000;break;
}
fr(i,a,b){
k=a;
p=i;
sum=0;
while(k){
sum+=fun(n,p/k);
p=p%k;
k=k/10;
}
if(sum==i){
printf("%d\n",i);
}
}
}
方法二:
#include<stdio.h>
#include<math.h>
int fun(int n,int m){
int sum=1;
for(int j=0;j<n;j++){
sum*=m;
}
return sum;
}
int main(){
int a,b,n,sum,p;
scanf("%d",&n);
for(int i=pow(10,n-1);i<pow(10,n);i++){
a=pow(10,n-1);
p=i;
sum=0;
while(a){
sum+=fun(n,p/a);
p=p%a;
a=a/10;
}
if(sum==i){
printf("%d\n",i);
}
}
}