C++实验——自幂数(数学黑洞你怕不怕)

何谓自幂数,即n位正整数,各位的n次幂相加还等于这个数本身。

n=1,称为独身,0~9均为自幂数;

n=2,没有自幂数;

n=3,水仙花数,如153;

n=4,四叶玫瑰数;

n=5,五角星数;

n=6,六合数;

n=7,北斗七星数;

n=8,八仙数;

n=9,九九重阳数。

这其实在深究上升到了数学黑洞的概念——对于数学黑洞,无论怎样设值,在规定的处理法则下,最终都将得到固定的一个值,再也跳不出去了,就像宇宙中的黑洞可以将任何物质,以及运行速度最快的光牢牢吸,不使它们逃脱一样。这就对密码的设值破解开辟了一个新的思路。

抛开玄奥的数学理论,自幂数的求解很有意思,尤其是对编程处理有启发意义,所以今天我来总结一下。

#include <iostream>
#include <cmath>
int main()
{
	using namespace std;
	int n; //表示数的位数
	int start, end; //表示n位数的起始值和终止值
	int m;//待分解各位的数,即待判断的数
	int digit;//某个数位的值
	int sum; //各位数的n次方的和
	int i; //循环变量,待检测的数
	cout << "求n位自幂数,请输入位数:\n";
	cin >> n;
	while (n>0)
	{
		start = pow(10, n - 1); //n位数的起始值
		end = pow(10, n) - 1;//n位数的终止值
		cout << n << " 位自幂数:";
		for (i = start; i <= end; i++)
		{
			m = i; //检测过程中m的值会改变,而i的值不变
			sum = 0;//检测前赋值0
			while (m != 0) //m开始为待检测的数
			{ //分离各位数字
				digit = m % 10;//取最低位数
				sum += pow(digit, n);
				m = m / 10;//去掉个位,刚才的十位成为新的各位
			}
			//上面的循环结束时sum就是各位数字的n次方的和
			if (sum == i) //逻辑表达式的值为true时,表示的是自幂数
			{
				cout << i << " "; //显示该数
			}
		}
		cout << endl;
		cout << "求n位自幂数,请输入位数:\n";//再输入一个n表示位数
		cin >> n;
	} //while循环
	cout << endl;
	return 0;
}

源代码如上所示。提供的思路:

1.如何分离各位数字;

2.如果计算会破坏或改变某个变量的值,而这个原始值在后面还是用到,需要额外声明一个变量来做破坏性试验;这实际是计算机科学中的一种“冗余”思想,要获得某种保障有意得使用更多的时间和空间。



猜你喜欢

转载自blog.csdn.net/fly_wt/article/details/79676739