求出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。
*/
这是我在日常练习中发现的一道题,我的想法是求出三位数的个位数,十位数,百位数然后利用每个数的立方和判断是不是水仙花数.
#include <stdio.h>
#include <stdlib.h>
int main(){
int i = 100;
int a = 0;
int b = 0;
int c = 0;
for ( i = 100; i < 1000; i++)
{
a = i %1000;
b = i %100;
c = i %10;
if (i==a*a*a+b*b*b+c*c*c)
{
printf("%d\n", i);
}
}
system("pause");
return 0;
}
但是经过编译发现结果不对,如果按照我的写法个位数可以,但是十位数,百位数就不对了.举个例子,如果三位数为123,个位数:123%10==3,但是十位数:123%100==23,后面的同样如此.经过这次,我发现我的思路还是不够严谨.
最后经过搜索加上自己的理解算十位数是,先给原数除以10,这样就可以让十位数相当与个位数,然后按照个位数的算法可以求出十位数.百位数以及更多的位数可以一次类推.
就这个题而言我最后改为
#include <stdio.h>
#include <stdlib.h>
int main(){
int i = 100;
int a = 0;
int b = 0;
int c = 0;
for ( i = 100; i < 1000; i++)
{
a = i / 100%10;
b = i / 10%10;
c = i / 1%10;
if (i==a*a*a+b*b*b+c*c*c)
{
printf("%d\n", i);
}
}
system("pause");
return 0;
}