1 水仙花数概念及“常见”水仙花数
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。(百度百科)
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
常见水仙花数
水仙花数又称阿姆斯特朗数。
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477;
九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;
十位的自幂数只有1个:4679307774
2.求三位数水仙花数以及指定位数的水仙花数
所以求水仙花数的关键就是把每个位上的数字求出来,然后求出它们的幂次方之和,与求的这个数相比是否相等,相等就是水仙花数,然后输出,判断下一个数,直到判断完最后一个n位的数为止。
(1)求三位数的水仙花数
#include<stdio.h>
int main() {
int m,n,i,a,sum;
for(a=100; a<=999; a++) {//所有三位数
m=a/100;//求最高位的数字
n=(a-m*100)/10;//求十位数字,先剪掉百位数字再求(352求十位时要减去3*100)
i=a-m*100-n*10;//个位
sum=m*m*m+n*n*n+i*i*i;//算出幂次方的和,然后比较
if(sum==a) {
printf("%d ",a);
}
}
return 0;
}
运行结果
(2)求指定位数的水仙花数
#include <stdio.h>
#include <math.h>
int main() {
int a,m,n,i,j,sum;
printf("输入需要求水仙花的位数:\n");
scanf("%d",&a);
for(n=pow(10,a-1); n<pow(10,a); n++) {
j=0;//初始化j,防止上一次循环的j对本次造成干扰,以下同理
int y=0;
sum=0;
for(i=a-1; i>=0; i--) {//循环三次求每个位数的值
m=pow(10,i);//m为10的i次方
if(i!=0) {
j=(n-y)/m;//y为前面位数的和,比如求四位数的水仙花数时,
//如1503,第一个是求1,此时n减去0除以1000;第二位求5,
//n减去j乘以1000再除以100
} else {
j=n-y;//求个位数字时直接减掉前面的和
}
y+=j*pow(10,i);//y为前几位的和,比如第一次求最大位1时,y为0,到这里就变成j乘以1000了
sum+=pow(j,a);//幂次方的和
}
if(sum==n) {//判断时否为水仙花数
printf("%d ",n);
}
}
return 0;
}
这里用math.h中的pow函数表示幂次方
结果如下
制作不易,还请各位帅哥美女点个赞鼓励一下我这个小白!爱你!!!