水仙花数升级版问题

0

问题描述:

一个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);
			}
		}
}
ava
北冥有鱼

2023-2-26

0

double 类型没有取余运算,并不会为取余运算而进行四舍五入,规定如此。

ava
慢羊羊

2023-2-27

技术讨论社区