思路: 每次取当前数字的一半,如123111 取123,然后减1,即123-1=122 ,然后构造回文数字122221,然后用原来的数字减去 继续构造
为什么减1? 就是如上面的例子 不减1 是123321 比原数都大
细节:小于20的时候 如果大于11 构造个11和x 小于11
就拆成(9+1)或一个一位数
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int t,ok=1;
Scanner scanner=new Scanner(System.in);
t=scanner.nextInt();
while(t--!=0){
System.out.println("Case #"+ok+":");
ok++;
int n=0;
String s=scanner.next();
String ans[]=new String[1005];
if(check(s)){
System.out.println(1);
System.out.println(s);
continue;
}
while(true){
String string=s;
if(s.length()==1||check(s)){
ans[n++]=s;
break;
}
if(s.length()%2==0){
int len=s.length()/2;
String temp="";
if(len==1&&s.charAt(0)=='1'){
if(s.compareTo("11")>=0)
string = "11";
else string = "9";
}
else{
for(int i=0;i<len;i++)
temp+=s.charAt(i);
temp=new BigInteger(temp).subtract(BigInteger.ONE).toString();
len=temp.length();//注意上面减了个1 位数可能变化
for(int i=len-1;i>=0;i--)
temp+=temp.charAt(i);
string=temp;
}
}
else{
int len=s.length()/2;
String temp="";
if(len==1&&s.charAt(0)=='1'){
BigInteger bigInteger=new BigInteger(s);
for(int i=bigInteger.intValue();i>=1;i--){
bigInteger=bigInteger.subtract(BigInteger.ONE);
if(check(bigInteger.toString())){
string=bigInteger.toString();
break;
}
}
}
else{
for(int i=0;i<len;i++)
temp+=s.charAt(i);
temp=new BigInteger(temp).subtract(BigInteger.ONE).toString();
len=temp.length();//注意上面减了个1 位数可能变化
temp+=s.charAt(len);
for(int i=len-1;i>=0;i--)
temp+=temp.charAt(i);
string=temp;
}
}
ans[n++]=string;
BigInteger b=new BigInteger(string);
s=new BigInteger(s).subtract(b).toString();
}
System.out.println(n);
for(int i=0;i<n;i++)
System.out.println(ans[i]);
}
}
static boolean check(String s){
int l=0,r=s.length()-1;
while(l<=r){
if(s.charAt(l)!=s.charAt(r))
return false;
l++;
r--;
}
return true;
}
}