求0~999之间的所有“水仙花数”并输出。
“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。
/*
首先我们先了解一下什么叫水仙花,在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数:
153 = 1^3 + 5^3 + 3^3。
370 = 3^3 + 7^3 + 0^3。
371 = 3^3 + 7^3 + 1^3。
407 = 4^3 + 0^3 + 7^3。
*/
要求一个水仙花,我们先要得到它的百位上的数字,怎么得到呢?我们只需要让这个数除以一百就得到了百位上的数字;
同理,用这个数先对一百取余得到一个两位数,再用得到的两位数除以10,我们便得到十位数的数字;
个位上的数字当然只需要对10取余就得到啦,以下就是具体的得到相应数字的计算公式
//a=i/100; // 153除以100得到1
//b=(i%100)/10; // 153对100取余得到53,53对10取余得到3
//c=i%10;
接下来我们就需要对这个数进行判断,将各个数字进行立方计算并相加,把相加的结果与这个数进行比较,如果是一样打的数,那么这个数就是水仙花。
if (i == sum && i != 0 && i !=1) //这里我们需要判断
#include<stdio.h>
int main()
{
int i,sum;
int a,b,c;
for(i=0;i<999;i++)
{
a=i/100; // 153除以100得到1
b=(i%100)/10; // 153对100取余得到53,53对10取余得到3
c=i%10;
sum = a*a*a+b*b*b+c*c*c;
if (i == sum && i != 0 && i !=1)
{
printf("%d ",i);
}
}
return 0;
}
其实,以上方法是大多数人的正常思考习惯,虽然按要求求出了0~999之间的水仙花,但是还是有局限性的,以下给出通用的简洁算法。
int main()
{
int i = 0;
for(i=1; i<=1000; i++)
{
//1. 获得i的位数
//123
int tmp = 0;
int count = 1;
int sum = 0;
tmp = i;
while(tmp>=10)
{
count++;
tmp=tmp/10;
}
//2. 获得i的每一位,计算次方和
tmp = i;
while(tmp)
{
sum = sum + pow(tmp%10, count);
tmp = tmp/10;
}
//3. 判断是否为水仙花数
if(sum == i)
{
printf("%d ", i);
}
}
return 0;
}