关于查找回归数算法的实现


前两天在网上看了一篇关于回归数的文章。看完后也想自己实现一个查找回归数的算法。

首先介绍一下回归数,以下是摘录了百度百科的

【回归数猜想】

  英国大数学家哈代(G.H.Hardy,1877-1947)曾经发现过一种有趣的现象:
  153=1^3+5^3+3^3 371=3^3+7^3+1^3 370=3^3+7^3+0^3 407=4^3+0^3+7^3
  *注: 1^3代表1的3次方。其他类同。
  他们都是三位数且等于各位数字的三次幂之和,这种巧合不能不令人感到惊讶.更为称奇的是,一位读者看过哈代的有趣发现后,竟然构造出其值等于各位数字四(五,六)次幂之和的四(五,六)位数:
  1634=1^4+6^4+3^4+4^4 54748=5^5+4^5+7^5+4^5+8^5 548834=5^6+4^6+8^6+8^6+3^6+4^6
  像这种其值等于各位数字的 n 次幂之和的 n 位数,称为 n 位 n 次幂回归数.本文只讨论这种回归数,故简称为回归数,人们自然要问:对于什么样的自然数 n 有回归数?这样的 n 是有限个还是无穷多个?对于已经给定的 n ,如果有回归数,那么有多少个回归数?
  1986年美国的一位数学教师安东尼.迪拉那(Anthony Diluna)巧妙地证明了使 n 位数成为回归数的 n 只有有限个.
  设 An 是这样的回归数,即:
  An=a1a2a3...an=a1n+a2n+...+ann (其中 0<=a1,a2,...an<=9)
  从而 10n-1<=An<=n9n 即 n 必须满足 n9n>10n-1 也就是 (10/9)n<10n ⑴
  随着自然数 n 的不断增大,(10/9)n 值的增加越来越快,很快就会使得 ⑴ 式不成立,因此,满足⑴的 n 不能无限增大,即 n 只能取有限多个.进一步的计算表明:
  (10/9)60=556.4798...<10*60=600 (10/9)61=618.3109...>10*61=610
  对于 n>=61,便有 (10/9)n>10n
  由此可知,使⑴式成立的自然数 n<=60.故这种回归数最多是60位数.迪拉那说,他的学生们早在1975年借助于哥伦比亚大学的计算机得到下列回归数:
  一位回归数:1,2,3,4,5,6,7,8,9
  二位回归数:不存在
  三位回归数:153,370,371,407
  四位回归数:1634,8208,9474
  五位回归数:54748,92727,93084
  六位回归数:548834
  七位回归数:1741725,4210818,9800817
  八位回归数:24678050,24678051

看了上面的文章,觉得用计算机来查找回归数应该不是很难,由此我写了如下的算法来查找回归数:

#include <iostream>
#include <math.h>
using namespace std;
//
//find  back number
#define MAX_INT 2147483647
void FindBackNumber(int nValue)
{
for (int j = 1; j< MAX_INT; j++)
{
int nBitCount = (int)log10((double)j);
nBitCount++;
if(nBitCount> nValue)
{
return;
}
int m = 0;
int n = j;
while (n !=0)
{
m += (int)pow((double)(n%10),nBitCount);
n /= 10;
}
m += (int)pow((double)(n%10),nBitCount);
if(j == 153)
{
int a = 0;
}
if(m == j)
{
printf_s("%d is a back number;\r\n",j);
}
}
}
int main()
{
//
//find back number
FindBackNumber(7);
return 0;
}

上面的代码在vs2008调试通过。这个算法应该还有优化的空间,可惜我没有找到,有高手找了还望不吝赐教:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值