“水仙花数”,又称“三位自幂数”,是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=。
基本算法:
#include<stdio.h>
int main() {
int g,s,b,n;
for(n=100; n<1000; n++) {
g=n%10; //个位
s=n/10%10; //十位
b=n/100; //百位
if(b*100+s*10+g==b*b*b+s*s*s+g*g*g)
printf("%5d",n);
}
printf("\n");
}
输出结果:
153 370 371 407
类似水仙花数的还有:
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
统一的算法如下:
#include<stdio.h>
int power(int m,int n) {
int i,t=1;
for(i=0; i<n; i++) t=t*m;
return t;
}
int main() {
int num[8],n;
int i,j;
int begin,end,t,value;
int result[10][8];
for(i=0; i<=9; i++) //为提高效率,先计算好0~9十个数的1~8次方
for(j=0; j<8; j++)
result[i][j]=power(i,j+1);
for(i=3; i<=8; i++) {
begin=power(10,i-1);
end=power(10,i);
printf("%2d位自幂数:",i);
for(n=begin; n<end; n++) {
t=n;
value=0;
for(j=0; j<i; j++) {
num[j]=t%10; //个位数0~9
value=value+result[num[j]][i-1];//直接取值
t=t/10; //去掉个位数
}
if(value==n)
printf("%d ",n);
}
printf("\n");
}
}
输出结果:
3位自幂数:153 370 371 407
4位自幂数:1634 8208 9474
5位自幂数:54748 92727 93084
6位自幂数:548834
7位自幂数:1741725 4210818 9800817 992631
8位自幂数:24678050 24678051 88593477
9、10位自幂数超出int类型值域,读者可以尝试用更高的类型来计算。