标题:生成回文数
所谓回文数就是左右对称的数字,比如:
585,5885,123321...
当然,单个的数字也可以算作是对称的。
小明发现了一种生成回文数的方法:
比如,取数字19,把它与自己的翻转数相加:
19 + 91 = 110,如果不是回文数,就再进行这个过程:
110 + 011 = 121 这次是回文数了。
200以内的数字中,绝大多数都可以在30步以内变成回文数,只有一个数字很特殊,就算迭代了1000次,它还是顽固地拒绝回文!
所谓回文数就是左右对称的数字,比如:
585,5885,123321...
当然,单个的数字也可以算作是对称的。
小明发现了一种生成回文数的方法:
比如,取数字19,把它与自己的翻转数相加:
19 + 91 = 110,如果不是回文数,就再进行这个过程:
110 + 011 = 121 这次是回文数了。
200以内的数字中,绝大多数都可以在30步以内变成回文数,只有一个数字很特殊,就算迭代了1000次,它还是顽固地拒绝回文!
请你提交该顽固数字,不要填写任何多余的内容。
题目虽然不难,但是还是有经验可以总结。循环相加时用int 和long 都溢出,然后吧所有的方法转换成BigInteger,拜拜浪费时间,以后还得提前预判才好
package 总决赛;
import java.io.*;
import java.math.BigInteger;
public class 生成回文数 {
static boolean is_hws(BigInteger n){//是否是回文数
String s = String.valueOf(n);
char []c = s.toCharArray();
int j = 1;
for(int i=0;i<c.length;i++){
if(c[i] != c[c.length-j])
return false;
if(i >= c.length-1-i)
return true;
j++;
}
return true;
}
static BigInteger fzs(BigInteger n){//生成翻转数
String s = String.valueOf(n);
char []c = s.toCharArray();
char f[] = new char[c.length];
int l = c.length;
for(int i=0;i<c.length;i++){
f[--l] = c[i];
}
// String s1 = "";
// for(int i=0;i<c.length;i++){
// s1 += String.valueOf(f[i]);
// }
String s1 = new String(f);
BigInteger b = new BigInteger(s1);
return b;
}
static int f(BigInteger n){//n需要多少步可以转换成回文数
int num = 0;
while(!is_hws(n)){
// System.out.println(n);
n = n.add(fzs(n));
num++;
if(num>=1000)
break;
}
return num;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// System.out.print(is_hws(01123211));
for(int i=1;i<=200;i++){
System.out.println(i+" "+f(BigInteger.valueOf(i)));
if(f(BigInteger.valueOf(i))>=1000)
System.out.println(i);
}
// System.out.println(is_hws(887));
// f(89);
}
}