C:打印水仙花数,并将其拓展!

定义:

在数论中,水仙花数(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;
}

C:打印水仙花数,并将其拓展!_第1张图片

此时我们可以看到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:打印水仙花数,并将其拓展!_第2张图片
以上是打印出来10万以内的“水仙花数”!

初识C语言,如有其他见解,欢迎留言评论!

你可能感兴趣的:(C语言)