196算法的JavaScript实现

很多数字可以被转换成“回文数”,通过应用“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;
    }
    
}


猜你喜欢

转载自blog.csdn.net/esir82/article/details/78729626
今日推荐