水仙花数
水仙花数(Narcissistic number)也被称为超自然数字不变数(pluperfect digital invariant, PPDI)、自恋数、自慕数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。
- 一个三位数,如果等于它的三个数字的三次方之和,则该三位数称为三位水仙花数;
- 一个四位数,如果等于它的四个数字的四次方之和,则该四位数称为四位水仙花数;
如:153= 1^3+ 5^3+ 3^3=1+125+27
则称153为三位水仙花数。
因此,如果我们想要求100-1000的三位水仙花数及其个数,可以用求余和整除的方法,将所求范围内的数字各位数上的数值拆分出来,做三次幂的运算或四次幂的运算。判断其是否符合水仙花数的要求,若符合则将其输出。
编程思路 (三位水仙花数)
- 首先,设置变量1,确保遍历指定范围内的所有数,可以用 for 循环,变量的初始值为该范围内的首项,小于该范围的最大项。
- 其次,设置变量2,变量3,变量4,变量5(水仙花数的数量)。
- 个位(变量2):对变量1除10求余保存进变量2。(变量2=变量1%10)
- 十位(变量3):对变量1除100求余之后再除10保存进变量3。(变量3=(变量1%100)/10)
- 百位(变量4):对变量1除100。(变量4=变量1/100)
- 最后,用 if 条件语句判断变量2,3,4做三次幂运算是否等于变量1,若是则输出,使作为数量的变量5累加,若不是,则继续循环,直到遍历完变量1的所有数为止。
编程思路 (四位水仙花数)
- 首先,设置变量1,确保遍历该范围内的数,可以用 for 循环,变量的初始值为该范围内的首项,小于该范围的最大项。
- 其次,设置变量2,变量3,变量4,变量5,变量6。
- 个位(变量2):对变量1除10求余,保存进变量2。(变量2=变量1%10)
- 十位(变量3):对变量1除100求余再除10,保存进变量3。(变量3=(变量1%100)/10)
- 百位(变量4):对变量1除1000求余之后除100,保存进变量4。((变量4=变量1%1000)/100)
- 千位(变量5):对变量1除1000,保存进变量5。(变量5=变量1/1000)
- 最后,用 if 条件语句判断变量2,3,4,5做四次幂运算是否等于变量1,若是则输出,使作为数量的变量6累加,若不是,则继续循环,直到遍历完变量1的所有数为止。
源代码(三位水仙花数)
#include<stdio.h>
int main(){
int m,n; //计算的范围。
int i; //作为变量 1存在。
int a,b,c; //个位(变量2)十位(变量3)百位(变量4)
int counter=0; //水仙花数的数量,先初始化为 0。
scanf("%d %d",&m,&n);
if(m<100||n<100||m>n||m>100||n>999){
//判断输入数值是否合法。
printf("Your entry is invalid, please re-enter.");
return 1;
}
for(i=m;i<=n;i++){ //遍历 m-n 指定范围。
a=i%10; //个位(变量 2)
b=(i%100)/10; //十位(变量 3)
c=i/100; //百位(变量 4)
if(i==a*a*a+b*b*b+c*c*c){ //条件判断是否符合水仙花数的条件。
counter++;
printf("%d\n",i); //输出水仙花数
}
}
printf("There are %d Narcissistic number in total.",counter);
//输出水仙花数的数量。
return 0;
}
输入格式
输出格式
源代码(四位水仙花数)
#include<stdio.h>
int main(){
int m,n; //计算的范围。
int i; //作为变量 1存在。
int a,b,c,d; //个位(变量2)十位(变量3)百位(变量4)千位(变量5)
int counter=0; //水仙花数的数量,先初始化为 0。
scanf("%d %d",&m,&n);
if(m<1000||n<9999||m>n||m>1000||n>9999){
//判断输入数值是否合法。
printf("Your entry is invalid, please re-enter.");
return 1;
}
for(i=m;i<=n;i++){ //遍历 m-n 指定范围。
a=i%10; //个位(变量 2)
b=(i%1000)%100/10; //十位(变量 3)
c=i%1000/100; //百位(变量 4)
d=i/1000; //千位(变量 5)
if(i==a*a*a*a+b*b*b*b+c*c*c*c+d*d*d*d){
//条件判断是否符合水仙花数的条件。
counter++;
printf("%d\n",i); //输出水仙花数
}
}
printf("There are %d Narcissistic number in total.",counter);
//输出水仙花数的数量。
return 0;
}