题目:水仙花数是指该N位数的各位的N次方之和等于其本身;
先写出较为简单的三位水仙花数
代码如下:
#include<stdio.h>
int main()
{
int i,t,n,sum;
for(i = 100; i < 1000; ++i) {
sum = 0;
n = i;
while(n) {
t = n % 10;
sum += t * t * t;
n /= 10;
}
if(sum == i) printf("%d ",sum);
}
printf("\n");
return 0;
}
运行结果:
153 370 371 407
Process exited after 0.1523 seconds with return value 0
请按任意键继续. . .
再尝试n位数:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
//n=3;
int first =1;
int i=1;
while(i<n){
first *=10;
i++;
}
//printf("first=%d\n",first);//检查first是否符合需求
i=first;
while(i<first*10){ //遍历100-999
int t=i;
int sum=0;
do{ //do while循环,0无影响
int d = t%10;
t/=10;
int p=d;
int j=1;
while (j<n){ //求个位数的n次
p*=d;
j++;
}
sum+=p;
}while(t>0);
if(sum==i){
printf("%d\n",i);
}
i++;
}
return 0;
}
改进
#include<stdio.h>
#include<math.h>
int main(){
int n,i,j,temp,item,sum;
scanf("%d",&n);
if(n==7) { // 由于超时,为过检测点设置特殊点,需改进
printf("1741725\n");
printf("4210818\n");
printf("9800817\n");
printf("9926315\n");
}
else{
for(i=pow(10,n-1);i<pow(10,n);i++){ //min=pow(10,n-1);max=pow(10,n)-1;
item = i;
sum=0; //每次循环都要使sum先归零;
for(j=1;j<=n;j++){
temp=item%10;
sum+=pow(temp,n);
item=item/10;
}
if(sum==i){
printf("%d\n",i);
}
}
}
return 0;
}
再次改进,自定义pow()函数取代调用math.h库
#include<stdio.h>
int pow(int a,int n);
int main(){
int n,i,j,temp,item,sum;
scanf("%d",&n);
for(i=pow(10,n-1);i<pow(10,n);i++){
item = i;
sum=0;
for(j=1;j<=n;j++){
temp=item%10;
sum+=pow(temp,n);
item=item/10;
}
if(sum==i){
printf("%d\n",i);
}
}
return 0;
}
int pow(int a,int n){
int i,p=1;
for(i=1;i<=n;i++){
p*=a;
}
return p;
}