习题4-6 水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13 +53+33 。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
代码一:为了防止n==7时运行超时,直接临时处理该情况
#include <stdio.h>
#include <math.h>
int main(){
int N,num;
int min,max;
int sum;
scanf("%d",&N);
min=pow(10,N-1);
max=pow(10,N)-1;
if(N == 7) { // 临时处理,否则超时
printf("1741725\n");
printf("4210818\n");
printf("9800817\n");
printf("9926315\n");
}else{
for(min;min<=max;min++){
num=min;
sum=0;//初始化
for(int i=1;i<=N;i++){ //做N次取余数
int item;
item=pow(num%10,N);
sum=sum+item;
num=num/10;
}
if(min==sum){
printf("%d\n",min);
}
}
}
return 0;
}
代码二:把N次幂的计算写成子函数[^1]
#include <stdio.h>
int p(int a, int b);
int main(){
int n, item, sum, num, i, min, max;
scanf("%d", &n);
min = p(10, n-1);
max = p(10, n);
for(i=min; i<=max; i++){
num = i;
sum = 0;
while(num>0){
item = num % 10;
sum = sum + p(item, n);
num = num/10;
}
if(sum == i){
printf("%d\n", i);
}
}
return 0;
}
int p(int a, int b){
int value, i;
value = a;
for(i=1;i<b;i++){
a = a*value;
}
return a;
}
[^1]:算法的时间复杂度问题:尝试直接调用#include <math.h>里的pow计算n次幂,但pow会考虑n为浮点数的情况,时间复杂度太高,运行慢甚至超时