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<iostream>
#include<string>
#include<math.h>
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;
}

输出结果如下:

水仙花数,只是自幂数的一种,严格来说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<iostream>
#include<string>
#include<math.h>
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函数包含在<math.h>头文件中,在C++中的定义为

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

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

输出结果如下:

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值