函数1.判断是否为水仙花
(知识)水仙花数:
如 153 是三位数
且153=1的三次幂+5的三次幂+3的三次幂
即153=1+125+27成立
故153是水仙花数
如1634是四位数
且1634=1的四次幂+6的四次幂+3的四次幂+4的四次幂
即1634=1+1296+81+256成立
故1634为水仙花数
1.难点:只知道范围在100-10000
但不知道具体几位数
故首先要先判断位数
while(n!=0){
n=n/10;
wei++;}//判断位数
2.取出每一位 用每一位乘位数次幂
while(n!=0){
digit=n%10;//取出每一位
n=n/10;
sum=sum+pow(digit,wei);
}
想清楚这两个 函数1 基本上就可以实现了
3.易错:要引入一个 n 去计算位数 以及取出每一位
因为后面number还要跟sum判断 所以number的值不能变 number的值应该等于一开始传进去的那个数字
函数1:
int narcissistic( int number ){
int digit,sum=0,wei=0,n;
n=number;
while(n!=0){
n=n/10;
wei++;}//得到位数
n=number;//!!因为现在n为0了 所以需要重新等于原数
while(n!=0){
digit=n%10;//取出每一位
n=n/10;
sum=sum+pow(digit,wei);
}
//判断和是否等于原数
if(sum==number)
return 1;
else
return 0;
}
函数2:打印(m,n)中的水仙花数
要开区间 即不包含m n的
故用以i=m-1起点
i>n为判断条件
(如【m,n】闭区间,则i=m为起点,i>=n为判断条件)
嵌套调用函数1
函数2
void PrintN( int m, int n ){
int i;
for(i=m+1;i<n;i++){ //(m,n)
if(narcissistic(i)==1){
printf("%d\n",i);//打印功能的 无需返回值的
}
}
}
最终代码:
#include <stdio.h>
#include<math.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
//函数1
int narcissistic( int number ){
int digit,sum=0,wei=0,n;
n=number;
while(n!=0){
n=n/10;
wei++;}//得到位数
n=number;
while(n!=0){
digit=n%10;//取出每一位
n=n/10;
sum=sum+pow(digit,wei);
}
//判断和是否等于原数
if(sum==number)
return 1;
else
return 0;
}
//函数2
void PrintN( int m, int n ){
int i;
for(i=m+1;i<n;i++){ //(m,n)
if(narcissistic(i)==1){
printf("%d\n",i);
}
}
}