水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
#include<stdio.h>
#include<math.h>
void fun(int num,int n){
int digit,temp;
double sum=0;
temp=num;
do{
digit=temp%10;
temp/=10;
sum+=pow(digit,n);
}while(temp>0);
if(num==sum){
printf("%d\n",num);
}
}
int main(void){
int n,temp,digit;
double i,sum;
scanf("%d",&n);
for(i=pow(10,n-1.0);i<pow(10,n);i++){
fun(i,n);
}
return 0;
}
思路:如果用上面的代码的话,会发现一个很严重的问题,那就是pow(digit,n)这条语句会重复运行9*10^n次,为了减少重复时间(主要是为了拿满分),避免运行超时这个错误,则需要运行时间缩短。
而我的想法是保存好0~9之间n次,这样减少了运行pow()这个函数的次数,而为了更加简洁明了(主要是定义10个变量太麻烦了),我则用了数组来保存这个运算的结果。这样运算的话,我们只需要用10次就可以完成之前9*10^次的操作。
#include<stdio.h>
#include<math.h>
static int p[9];
void narcissistic(int n){
int digit,temp,sum;
for(double i=pow(10,n-1.0);i<pow(10,n);i++){
temp=i;
sum=0;
do{
digit=temp%10;
temp/=10;
sum+=p[digit];
}while(temp>0);
if(i==sum){
printf("%d\n",sum);
}
}
}
int main(void){
int n;
scanf("%d",&n);
for(int i=0;i<=9;i++){
p[i]=pow(i,n);
}
narcissistic(n);
return 0;
}