问题描述:
一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为水仙花数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153;
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634;
请编写程序,当输入任意正整数时,倒序输出大于10小于该数的所有水仙花数。
遇到问题:
(1)以下代码经修改可以解决上述问题,不过在第二个函数求其他位数的N次方相加那里我原本是一步到位进行计算:
m=num/pow(10,i)%10
但是会报错,提示%左边不能有double类型的数据,拆开来就不会有这个问题,我知道拆开来m会取整型,但是连起来从左往右计算到%时前面的num/pow(10,i)不是也会取整型吗?为什么会报错呢?这个问题我想不明白为什么,想知道c在计算这一式子的过程究竟是怎么样的。
(2)想问问对这题有没有更好的解法,我觉得我的方法比较暴力不是很好。
编译环境:vc2010express
#include <stdio.h>
#include <math.h>
//用于求输入整数的位数
int getN(int num){
int n = 2;
while(num>=10){
num=num/10;
n++;
}
return n-1;
}
//求输入整数各位数N次方之和
int add(int num,int N){
int g,n,m,sum,i;
n=0;
m=0;
sum=0;
//先求个位数的N次方
g=num%10;
sum=pow(g,N);
//求其他位数的N次方并相加
for(i=1;i<N;i++){
n=pow(10,i);
m=num/n;
m=m%10;
sum+=pow(m,N);
}
return sum;
}
void main(){
int N,num,value,i,count;
count=0;
value=0;
printf("请输入一个正整数:");
scanf("%d",&num);
if(num<10){
printf("输入不合法\n");
}
else{
for(i=num-1;i>10;i--){
N = getN(i);
value = add(i,N);
if(i==value){
count++;
printf("%d\n",i);
}
}
if(count==0){
printf("在大于10小于%d之间没有水仙花数\n",num);
}
}
}