回文数
“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
简介
回文数是指一个像16461这样“对称”的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。这里,“回文”是指像“妈妈爱我,我爱妈妈”这样的,正读反读都相同的单词或句子。
回文数在休闲数学领域备受关注。一个典型的问题就是,寻找那些具有某种特性,并且符合回文特征的数。例如:
回文素数:2, 3, 5, 7, 11, 101, 131, 151,… A002385回文平方数:0, 1, 4, 9, 121, 484, 676, 10201, 12321,… A002779
Buckminster Fuller(Buckminster Fuller)在其著作《协同学》(Synergetics)中把回文数也叫做沙拉扎数(Scheherazade Numbers),沙拉扎是《一千零一夜》中那位讲故事的王妃、即宰相的女儿的名字。
直观地,在任意的基下都存在着无穷多个回文数。可以这样说明:在任意的基下,一个象101, 1001, 10001,… (即由一个1后接n个0再后接一个1)这样的数可组成一个无穷多项的序列,其各项全部都是回文数,因此这个基下的回文数有无穷多个(其中包括但不限于该序列中的无穷多个项)。
十进制回文数
10基数下,所有单个数字{0、1、2、3、4、5、6、7、8、9}都是回文数。
两位数的回文数有9个:
{11, 22, 33, 44, 55, 66, 77, 88, 99}.
三位数中有90个回文数:
{101, 111, 121, 131, 141,151, 161, 171, 181, 191, ..., 909, 919, 929, 939, 949, 959, 969, 979, 989, 999}
四位数中也有90个回文数:
{1001, 1111, 1221, 1331, 1441, 1551, 1661, 1771, 1881, 1991, ..., 9009, 9119, 9229, 9339, 9449, 9559, 9669, 9779, 9889, 9999},
因此总共有199个小于104的回文数。小于105的回文数有1099个,对其它的10的整数幂10n来说,分别有:1998, 10998, 19998, 109998, 199998, 1099998, ... (OEIS中的数列A070199)个回文数。
其它基数下
也可在十进制以外的其它数系中考虑回文数。例如,在二进制中的回文数有:
0, 1, 11, 101, 111, 1001, 1111, 10001, 10101, 11011, 11111, 100001,…
以上这些数在十进制中即:0, 1, 3, 5, 7, 9, 15, 17, 21, 27, 31, 33,…(OEIS中的数列A006995)。梅森素数构成了二进制回文素数的一个子集。
通常在一个基数下的回文数在另一个基数下就不再是回文数。例如:。(下标的数字表示的是基数,即n16表示以十六进制写出的n)。然而,有些数字在几个基数中都是回文数(称为“协回文的”,copalindromic),例如10510在五个不同的基数下都是回文数:;十进制数1991在十六进制中为7C7,也是回文的。
在以18为基时,7的一些幂是回文的:
对任意数n,在所有的基数b下都是回文的(因为这时n是一个单位数);在基为时同样也是回文数(因为这时n就成了)。如果对于,某数在基b下都是非回文数,则称其是一个严格非回文数(Strictly non-palindromic number)。例如6在二进制是110,三进制是20,四进制是12,都不是回文数,因此它是严格非回文数。这样的数其中一个特质是6以上的数都是质数。首几项:1, 2, 3, 4, 6, 11, 19, 47, 53, 79, 103, ... (OEIS:A016038)
1000以内
在自然数中,最小的回文数是0,其次是
1,2,3,4,5,6,7,8,9,11,22,33,44,55,66,77,88,99,101,111,121,131,141,151,161,171,181,191,202,212,222,232,242,252,262,272,282,292,303,313,323,333,343,353,363,373,383,393,404,414,424,434,444,454,464,474,484,494,505,515,525,535,545,555,565,575,585,595,606,616,626,636,646,656,666,676,686,696,707,717,727,737,747,757,767,777,787,797,808,818,828,838,848,858,868,878,888,898,909,919,929,939,949,959,969,979,989,999.
平方回数
定义:一个回文数,它同时还是某一个数的平方,这样的数字叫做平方回数。例如:121。
100以上至1000以内的平方回数只有3个,分别是:121、484、676。
其中,121是11的平方。
484是22的平方,同时还是121的4倍。
676是26的平方,同时还是169的4倍。
举例
任意某一个数通过以下方式相加也可得到
如:还有 ,,
不过很多数还没有发现此类特征(比如196,下面会讲到)
另外个别平方数是回文数
。。。。
依次类推
上面这些算式,等号左边是两个(或三个)因数相乘,右边是它们的乘积。如果把每个算式中的“×”和“=”去掉,那么,它们都变成回文数,所以,我们不妨把这些算式叫做“回文算式”。还有一些回文算式,等号两边各有两个因数。请看:
不知你是否注意到,如果分别把上面的回文算式等号两边的因数交换位置,得到的仍是一个回文算式,比如:分别把“1”等号两边的因数交换位置,得到算式是:
这仍是一个回文算式。
还有更奇妙的回文算式,请看:
(积是2772)
(积是48384)
这种回文算式,连乘积都是回文数。
四位的回文数有一个特点,就是它决不会是一个质数。设它为abba,那它等于,。能被11整除。
六位的也一样,也能被11整除
还有,人们借助电子计算机发现,在平方数、完全立方数中的回文数,其比例要比一般自然数中回文数所占的比例大得多。例如,,,,……都是回文数。
国内外研究
人们迄今未能找到五次方,以及更高次幂的回文数。于是数学家们猜想:不存在(;n、k均是自然数)形式的回文数。
在电子计算器的实践中,还发现了一桩趣事:任何一个自然数与它的倒序数相加,所得的和再与和的倒序数相加,……如此反复进行下去,经过有限次步骤后,最后必定能得到一个回文数。
这也仅仅是个猜想,因为有些数并不“驯服”。比如说196这个数,按照上述变换规则重复了数十万次,仍未得到回文数。但是人们既不能肯定运算下去永远得不到回文数,也不知道需要再运算多少步才能最终得到回文数。
计算回文
for '这里从100开始 后面可以随便填,我这里填99999 表示所有3位数到五位数之间的回文数
if StrReverse(i)=i then print i '用StrReverse函数 判断倒序后的数和原来数是否相同,如果相同者表示此数为回文数
探索过程
上而提到的196这个数,是第一个可能的“利克瑞尔数”,因而它受到了最多的关注。由于还不可能证明一个数永远不能形成“回文数”,所以“196和其他那些(看起来)不能形成回文数的数是利克瑞尔数”这一命题仅是猜想而非已获证明。能证明的仅是那些反例,即如果一个数最终能形成“回文数”,则它不是“利克瑞尔数”。
在电子计算机尚未问世的1938年,美国数学家莱默(D. Lehmer,1905-1991)计算到了第73步,得到了一个没有形成“回文数”的35位的和数。至今挑战此题的数学爱好者从没有间断过,并随着计算机科技的发展,不断有发烧友编写不同的程序对此题发起挑战。据笔者最新调查,领军人W.V.Landingham到2006年2月已经计算到了699万步,得到了一个2.89亿位以上的和数,之间的结果仍未出现“回文数”。
另外介绍一个关于达到“回文数”需要计算步数的世界记录。它是一个19位数字1,186,060,307,891,929,990,算出“回文数,,需要了261步。它是由Jason Doucette的算法及程序于2005年11月30日发现的。下表列举的是各位数字中,到达“回文数”花费步数最多的代表性数字。
回文数算法
随意找一个十进制的数,把它倒过来成另一个数,再把这两个数相加,得一个和数,这是第一步;然后把这个和数倒过来,与原来的和数相加,又得到一个新的和数,这是第二步。照此方法,一步步接续往下算,直到出现一个“回文数”为n。例如:,,两步就得出了一个“回文数”。如果接着算下去,还会得到更多的“回文数”。这个过程称为“196算法”。
编程实现
JAVA源程序
11 is Plalindrome number
123 is not Plalindrome number
17251 is not Plalindrome number
2882 is Plalindrome number
用visual basic6.0
for '这里从100开始 后面可以随便填,我这里填99999 表示所有3位数到五位数之间的回文数
if StrReverse(i)=i then print i '用StrReverse函数 判断倒序后的数和原来数是否相同,如果相同者表示此数为回文数
用C语言编程
另外一种实现方法(C++)更简便
#include\u003ciostream\u003e
using namespace std;
bool symm(龙姓 m)
{
long temp = m,n=0;
while (temp)
{
n = n*10+temp%10;
temp = temp/10;
}
回车键 (m == n);
}
int main(int argc, _TCHAR* argv[])
{
long m;
cout\u003c\u003c"请输入一个整数:";
cin\u003e\u003em;
cout\u003c\u003c"输入了"\u003c\u003csymm(m)\u003c\u003c"个回文数!";
return 0;
}
Python源程序
求最长回文数长度的manacher算法(O(n))
参考资料
回文数——数苑中的一道风景线.CNKI(中国知网).2020-06-09
回文数的奥秘.CNKI(中国知网).2020-06-09
非十进制下的回文数.中国知网.2020-06-09