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