很多数字可以被转换成“回文数”,通过应用“196算法”。
“196算法”过程如下:
1. 接收一个正整数,对它的每个数位做翻转,和原数字相加。
2. 重复这个过程,直到得到回文数
以48这个正整数为例:
48 + 84 = 132
132 + 231 = 363
通过两次迭代,就能得到回文数363。
再比如59这个数:
59 + 95 = 154
154 + 451 = 605
605 + 506 = 1111
通过三次迭代,就能得到回文数1111。
事实上,绝大部分数都可以通过“196算法”得到回文数。
然而,还有极少的数,调用“196算法”不会停止。
也就是说,以现有计算机的能力,无法得到回文数。
这一类数,被称为“利克瑞尔数”。
对于10进制,还没有数字被证明是“利克瑞尔数”。
但是,有一些候选的“利克瑞尔数”,它们上百万次迭代都无法得到回文数。
这些候选数中,最小的是196。
所以“196”算法因此得名。
那么,如何用JavaScript实现“196”算法呢?
这个过程很简单,反复迭代就OK。
关键在于考虑“利克瑞尔数”。
如果超过了一定的时间或范围,应该及时中断。
我的处理是这样:
一旦当前运算会丢失精度,就返回-1。
确保小数范围内求解,不会出现死循环。
function isPalindromic(n){
n += "";
for(var i=0,j=n.length-1;i<j;i++,j--){
if(n.charAt(i) !== n.charAt(j)){
return false;
}
}
return true;
}
function reverse(n){
var res = "";
n += "";
for(var i=n.length-1;i>=0;i--){
res += n.charAt(i);
}
return +res;
}
function alg196(n) {
while(true){
var reversed = reverse(n);
var sum = n + reversed;
if(sum > Number.MAX_SAFE_INTEGER){
return -1;
}
if(isPalindromic(sum)){
return sum;
}
n = sum;
}
}