C++求水仙花数或自幂数

我们首先要明确水仙花数的概念:

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。

水仙花数共有4个:分别为153,370,371,407。

1^3+5^3+3^=153, 3^3+7^3+0^3=370,3^3+7^3+1^3=371,4^3+0^3+7^3=407。

可以看出,想要判断一个数字是否是水仙花数,首先要求出这个数字百位,十位,个位上的数,再求出它们的三次幂之和,于是根据规律写出代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;

int main()
{
	//遍历100-999之间的数字
	for (int i = 100; i < 1000; i++)
	{
		int a=i%10;      //取个位数字
		int b = (i / 10) % 10;//取十位数字
		int c= ((i / 10)/10) % 10;//取百位数字

		if (a * a * a + b * b * b + c * c * c == i)
		{
			cout << i << " ";
		}
	}
	system("pause");
	return EXIT_SUCCESS;
}

输出结果如下:

C++求水仙花数或自幂数_第1张图片

水仙花数,只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。其他的自幂数还有:

常见自幂数
一位 独身数 0,1,2,3,4,5,6,7,8,9
四位 四叶玫瑰数 1634,8208,9474
五位 五角星数 54748,92727,93084
六位 六合数 548834
七位 北斗七星数 1741725,4210818,9800817,9926315
八位 八仙数 24678050,24678051,88593477
九位 九九重阳数 146511208,472335975,534494836,912985153
十位 十全十美数 4679307774

其中一位数的自幂数就是本身,二位的自幂数不存在。

在求水仙花数的过程中,我们是分别设置了a,b,c三个变量,分别用来存储个位,十位,百位的数字。但是如果增加位数,这种方法就会显得过于麻烦,增大代码量。所以要求出更高位数的自幂数,也是先求出各个数位上的数字,对每一位的n次幂再进行求和。所以我们要关注的是怎样求出每个数位上的数字,寻找规律,使用循环结构。

在求水仙花数的代码中,取每个数位数字的时候,我们使用了取模%运算,取模运算是求两个数相除的余数,我们代入数字123,123%10的过程为,123除以10等于12余3,那么123%10的结果就为3,可以看出3正是123的个位数字。一个十进制数除以10就可以缩减一个数位,所以我们将123除以10得到的商12,再%10,就得到了12的个位数字,也就是123的十位数字2,最后用12除以10的商1,再次%10,得到1,也就是123的百位数字。于是,一个三位数的各数位上的数字都被取出。所以这个规律就是,先取模10,之后每次除以10之后取模再取模10,直至所有数位被取出。

程序代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
int main()
{
	for (int i = 0; i < 1000000; i++)
	{
		int np = 1;  // 表示数位
		int temp = i;  //防止i的值在循环中被改变,新定义一个变量值接收i的值
		while (temp / 10)
		{
			np++;
			temp = temp / 10;
		}
		int sum = 0;  //次幂和
		temp = i;   //再次使用temp接收i的值
		while (temp)
		{
			sum+=pow(temp % 10, np);  //pow函数求次幂
			temp = temp / 10;
		}
		if (sum == i)
		{
			cout << i << "  "; 
		}
	}
	system("pause");
	return EXIT_SUCCESS;
}

在for循环里,i从0取值到1000000,也就是能计算出1至6位所有的自幂数,np表示数位,定义变量temp 接收i的值,避免i的值在循环中被改变,从而陷入死循环。使用while()循环,括号中的条件为temp/10,当temp为1—9时,表达式结果为0,跳出循环。每次temp除以10,np便执行++操作。

sum整形变量是各个数位的次幂和,这里使用pow函数用来求次幂。

pow函数包含在头文件中,在C++中的定义为

_Check_return_ double __cdecl pow(_In_ double _X, _In_ double _Y);   表示用来求X的Y次幂。

最后是判断,如果各个数位的次幂和等于这个数本身,就符合自幂数的条件,将这个数输出。

输出结果如下:

C++求水仙花数或自幂数_第2张图片

你可能感兴趣的:(C++,c++)