在数论中,水仙花数(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。
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477
#include
#include
int main()
{
int i = 0;
int a = 0, b = 0, c = 0;
for (i = 100; i < 1000; i++)
{
c = i % 10;
b = (i / 10) % 10;
a = i / 100;
if (i == a*a*a + b*b*b + c*c*c)//切记,“==”才是“等于”
printf("%d ", i);
}
system("pause");
return 0;
}
如果此时,我们想获得1000以内的“水仙花数”的话我们只需在以上代码中稍作改动
#include
#include
#include
int main()
{
int i = 0;
int a = 0, b = 0, c = 0;
for (i = 0; i < 10; i++)
{
c = i % 10;
if (i == c)
printf("%d ", i);
}
for (i = 10; i < 100; i++)
{
c = i % 10;
b = i / 10;
if (i == b*b + c*c)
printf("%d ", i);
}
for (i = 100; i < 1000; i++)
{
c = i % 10;
b = (i / 10) % 10;
a = i / 100;
if (i == a*a*a + b*b*b + c*c*c)//切记,“==”才是“等于号”
printf("%d ", i);
}
system("pause");
return 0;
}
此时我们可以看到1000以内的“水仙花数”就只有这些,其中并没有2位数的“水仙花数”!
同理如果想看1万以内的,10万以内的“水仙花数”可以在以上的代码进行增删查改!
但是这样的算法过于幼稚,我们应该可以有更精妙的算法避免过于过于冗长的代码
#include
#include
#include
int main()
{
int i, j;
int sum = 0, count = 0;
int tmp[10] = { 0 };//定义数组的长度(只能长,不能短)
for (i = 0; i < 100000; i++)
{
for (j = i; j; j /= 10)//数位遍历(十进制)
{
tmp[count] = j % 10;
count++;
}
for (j = 0; j < count; j++)
{
sum += (int)pow(tmp[j], count);
}
//求n次方的一个函数pow,语法:double pow(double x,double y)
//(前面(tmp[j])是底数,后面(count)是次幂)
//"+="是因为pow一次只能算一位底数;(int)用于强制类型转换
if (i == sum)
printf("%d\n", i);
count = sum = 0;
}
system("pause");
return 0;
}
初识C语言,如有其他见解,欢迎留言评论!