未解之谜之数学的196算法

一 196算法简介
一个数正读反读都一样,我们就把它叫做“回文数”。随便选一个数,不断加上把它反过来写之后得到的数,直到得出一个回文数为止。例如,所选的数是 49,两步就可以得到一个回文数 484:

49 + 94 = 143
143 + 341 = 484

把 59 变成一个回文数则需要三步,得到回文数1111
59+95=154
154+451=605
605+506=1111

89 的“回文数之路”则特别长,要到第 24 步才会得到第一个回文数,8813200023188。

大家或许会想,不断地“一正一反相加”,最后总能得到一个回文数,这当然不足为奇了。事实情况也确实是这样——对于几乎 所有的数,按照规则不断加下去,迟早会出现回文数。不过,196 却是一个相当引人注目的例外。数学家们已经用计算机算到了 3 亿多位数,都没有产生过一次回文数。从 196 出发,究竟能否加出回文数来?196 究竟特殊在哪儿?这至今仍是个谜。

笔者写了个小程序,计算一下非196的回文数,见下:

二 java代码:

import java.math.BigInteger;
import java.util.Scanner;

public class OneNineSixBigRepeat {
    
    
    static boolean pr=false;//true  打印测试日志
    public static void main(String[] args) {
    
    
        boolean bool=true;
        System.out.println("请依次输入任意数字,并回车确认: ");
        Scanner inputW = new Scanner(System.in);
        while (bool) {
    
    
            int num= inputW.nextInt();
            BigInteger bNum = BigInteger.valueOf(num);
            String srtNum="";
            String StrNewNum="";
            int i=0;
            System.out.println("*******************************");
            do {
    
    
                i++;
                BigInteger bNumReverse = bIntReverse(bNum);
                bNum = bNum.add(bNumReverse);
                BigInteger bNewNum = bIntReverse(bNum);
                srtNum = String.valueOf(bNum);
                StrNewNum = String.valueOf(bNewNum);

            } while (!(srtNum.equals(StrNewNum)));

            System.out.println("第 "+i+" 步 回文数"+bNum+"出现!");
        }

    }
    //数组转数字 BigInteger
    static BigInteger arrayToInt(int[] arrayInt){
    
    
        String strNum="";
        for (int num : arrayInt) {
    
    
            strNum=strNum+Integer.toString(num);
        }
        //生成数字
        BigInteger bIntNum=new BigInteger(strNum);
        return bIntNum;
    }
    //数字反转
    static BigInteger bIntReverse(BigInteger bIntNum){
    
    
        String sNum=String.valueOf(bIntNum);
        int lNum=sNum.length();
        //数字转数组
        int[] arrayInt=new int[lNum];
        for (int i=0;i<lNum;i++){
    
    
            arrayInt[i]=Integer.parseInt(sNum.substring(i,i+1));
        }
        //反序数组
        int[] newArrayInt=new int[lNum];
        for (int i = arrayInt.length - 1; i >= 0; i--) {
    
    
            newArrayInt[lNum-1-i]=arrayInt[i];
        }
        //生成反序数
        BigInteger bNewNum=arrayToInt(newArrayInt);
        return bNewNum;
    }
}

三 运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/helloworldchina/article/details/105759329