水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
提交结果:
基本思路:
1.创建变量接收正整数N,并求出N位的所有数字
2.创建一个变量,接收每个位上数字的N次幂的和,并用于判断等于它本身
3.由于利用库函数pow比累乘N次计算N次幂慢,又因为调用次数过多,导致程序超时,因此需要自己编写代码实现累乘求N次幂。
4.判断是否是水仙花数并打印
代码实现:
1.非函数
#include<stdio.h>
#include<math.h>//调用两次pow影响不大
int main(){
int N=0;
scanf("%d",&N);//输入N位正整数
int min=pow(10,N-1);//N位数的最小值
int max=pow(10,N)-1;//N位数的最大值
for(int i=min;i<=max;i++){//N位数的所有数字
int sum=0;//每位的N次幕的和
int tmp=i;//用临时变量代替i,否则会死循环
while(tmp){
int part=1;//求每位N次幕时初始化,否则会累乘每位的N次幕
for(int j=1;j<=N;j++){//每位(最后一位)的N次幕
part*=tmp%10;
}
sum+=part;//加和每位的N次幕
tmp/=10;//减少一位(最后一位)
}
if(sum==i){//判断是否是水仙花数
printf("%d\n",i);//打印结果
}
}
return 0;
}
2.函数
#include<stdio.h>
int Pow(int k,int n){//求k的n次幕
int Pow=1;
for(int i=1;i<=n;i++){
Pow*=k;//累乘n次
}
return Pow;
}
int main(){
int N=0;
scanf("%d",&N);//输入N位正整数
int min=Pow(10,N-1);//N位数的最小值
int max=Pow(10,N)-1;//N位数的最大值
for(int i=min;i<=max;i++){//N位数的所有数字
int sum=0;//每位的N次幕的和
int tmp=i;//用临时变量代替i,否则会死循环
while(tmp){
sum+=Pow(tmp%10,N);//加和每位的N次幕
tmp/=10;//减少一位
}
if(sum==i){//判断是否是水仙花数
printf("%d\n",i);//打印结果
}
}
return 0;
}
欢迎提问和纠错,共同讨论一起进步!