一 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;
}
}
三 运行结果