在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一n位数,其各位数字的n次方和等于该数。
比如:
153 = 1^3 + 5^3 +3^3
407 = 4^3 + 0^3 + 7^3
先看一个简单的程序,假如现在我们只想知道100-999之间的水仙花数,这个问题其实就很好解决了,我们遍历100 - 999之间的所有数,把每一个数字的个位,十位,百位拿出来,再求三次方和,如果还等于原来的数.就是水仙花数,程序如下
int main(){
int n;
int a, b, c;
int sum;
for ( n = 100; n < 1000; ++n){
a = n / 100;
b = n / 10 % 10;
c = n % 10;
sum = a * a * a + b * b * b+ c * c * c;
if (n == sum){
printf("%d ",n);
}
}
system("pause");
return 0;
}
此时再回到原来的问题上,如果是0-99999之间呢,此时如果还用之前的方法,显然有些困难,因为我们不知道数字的位数,也不知道各位数字是多少!就无法求次方和.
此时我们所用思路如下
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//判断0-99999之间的阿姆斯特朗数
int main(){
int n;
int a[10] = { 0 };
int i;
int sum = 0;
int count = 0;
//由于不确定数的位数,所以找一个数组将每一位存起来,并且用count记下数字的位数
for (n = 0; n < 100000; ++n){ //遍历0-99999之间所有数字
for (i = n; i; i /= 10){
a[count] = i % 10; //将数字的每一位保存在数组当中
++count; //确定数字的位数
}
for (i = 0; i < count; ++i){
sum += pow(a[i],count); //将数组中所存的数字的每一位进行对应的count次方并求和
}
if (n == sum){
printf("%d \n",n);
}
count = sum = 0; //强制将count与sum归0
}
system("pause");
return 0;
}