题意

给你一个数字n(n < 10^1000),将其拆成若干个回文串(不超过50个)输出拆分方案

分析

不难想到,我们可以每次给n减一个小于他的最大的回文串,这样能够尽量构造出最少数量的回文串,方法可以使直接将前一半反转贴到后一半,如果比原来的数字大,那么前一半减少1,再反转贴为后一半
比较坑的地方就是 如果构造出来的是11比n大, 那么前一半-1变成了00 ,特判一下,应该为9;如果构造出来是101比n大,应该特判为99

这个题没太多好讲的,我想在这里记录一下java编程心得,以后也会更新

主体框架

import java.util.*;
import java.lang.*;
import java.math.*;
import java.text.*;
import java.io.*;
public class Main
{
    public static void main(String[] args)  {
        try
        {
            Scanner cin = new Scanner(System.in);
                    //文件流
            //PrintWriter out = new PrintWriter(new FileWriter("output.txt"));
                //Scanner cin = new Scanner(new File("input.txt"));  
        }catch(Exception e ){

        }
        
        
    }
}

这里的类名,在提交到oj上时,一定要取为Main,但是本机运行的时候,一定要取为和文件名相同的名字,否则会CE

输入

int n = cin.nextInt(); //读入一个整数
BigInteger n = cin.nextBigInteger(); // 读入一个大整数
double n = cin.nextDouble(); // 读入一个浮点数
String n = cin.next(); // 读入一个字符串
while(n = cin.hasNextInt()){
...
}

这里看起来是很有规律可循的……
输入输出优化

输出

int n = 10;
System.out.print("n = "+n); //不换行
System.out.println("n = "+n);//换行

print 会输出
n = 10
println 会输出
n =
10

定义数据类型

单个变量感觉和c++ 差别不大
int 是基本数据类型 Integer 是int的包装类
基本数据类型,分为boolean、byte、int、char、long、short、double、float;
为了能够将这些基本数据类型当成对象操作,Java为每 一个基本数据类型都引入了对应的包装类型
比如排序需要自定义排序规则时,只能用包装类型
定义数组为

Type [] s = new Type [55];

以及使用BigInteger 方法将字符串转为BigInteger时

BigInteger n = new BigInteger(s,10);

第一个参数为字符串,第二个参数为相应进制,对这个new,我现在不是太理解

比较大小

这里需要明白compareTo 和 == 的区别
通俗来说 == 是强相等,必须等号两边是同一个对象(可以理解成地址相同)才会返回True
而a.compareTo(b) 只要a和b数值相等就返回True
具体的比较方法,如果该数据类型有定义比较规则,就按比较规则来,比如String按字典序,按数值大小
compareTo的返回值表示比较的结果,如果 a>b 返回正数,a 和b相等 返回 0 ,a<b 返回负数

字符串String的一些操作

具体可以查阅 String.
String不等同于char[] ,它的值在创建后就不能改变
char[] 转String

char data[] = {'a', 'b', 'c'};
String str = new String(data);

取String的下标为i到j的子串

String subs = s.substring(i,j+1);

取字符串s下标为i的字符

char c  = s.charAt(i);

比较两个字符串大小

s1.compareTo(s2);

BigInteger的一些操作

具体可以查阅 BigInteger
四则运算

a = a.add(b); // a+=b;
a = a.subtract(b); // a-=b
a = a.multiply(b); // a*=b;
a = a.divide(b); //a/=b;
a = a.remainder(b) ; // a%=b;

位运算

a = a.and(b); // a = a&b;
a = a.or(b); // a = a|b;
a = a.xor(b) // a = a^b;
a = a.shiftLeft(n) // a = (a<<n);
a = a.shiftRight(n) // a=(a>>n)

BigDecimal的一些操作

因为我还没用过BigDecimal,直接先扔链接
BigDecimal

shell操作

这里不算是将java知识点,在shell下运行java,标准读入以及文件读入,应该还比较好理解

javac name.java // 编译
java name // 运行,标准读入,标准输出
java name <data.in //运行,文件读入,标准输出
java name >data.out // 运行,标准读入,文件输出
java name <data.int >data.out // 运行,文件读入,文件输出

STL (Collections)

java中也有类似c++STL 的存在,是一个叫做Collections的class,东西太多,不是很熟悉,先丢链接
Collections
讲一下排序方法

  • 以自然顺序(从小到大)排序
nt[] a = new int[15];
int n = cin.nextInt();
for(int i = 1;i<=n;i++) a[i] = cin.nextInt();
Arrays.sort(a,1,n+1); 
  • 自定义顺序(从大到小)顺序
import java.io.*;
import java.lang.*; 
import java.util.*;
import java.math.*;
import java.text.*;
public class test
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner(System.in);
        Integer[] a = new Integer[15];
        int n = cin.nextInt();
        for(int i = 1;i<=n;i++) a[i] = cin.nextInt();
        Comparator <Integer> c = new Mycomparator();   // 实例化一个Comparator对象 
        Arrays.sort(a,1,n+1,c);
        for(int i = 1;i<=n;i++) System.out.print(a[i]+" ");
        System.out.println();
    }
}
class Mycomparator implements Comparator <Integer>  
{  
        public int compare(Integer x, Integer y)
        {  
          
            if(x > y) return -1;  
            if(x < y) return 1;  
            return 0;  
        }  
}

AC代码

import java.util.Scanner;
import java.math.*;
import java.text.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner cin = new Scanner(System.in);
        int T = cin.nextInt();
        String [] s = new String [55];
        for(int Case=1;Case<=T;Case++)
        {
            BigInteger n = cin.nextBigInteger();
            int ans = 0;
            while(ans < 50 && n.compareTo(BigInteger.valueOf(0))>0 )
            {
                String t = n.toString();
                int lenth = t.length();
                if(lenth == 1){
                    ans+=1;s[ans] = t;
                    break;
                }
                    String t1 = "";
                    String t2 = "";
                    int mid = lenth/2-1;
                    for(int i = 0;i<=mid;i++)
                        t2 += t.charAt(i);
                    t1 = t2;
                    if(lenth %2!=0) t1 += t.charAt(lenth/2);
                    for(int i = mid;i>=0;i--)
                        t1+=t2.charAt(i);
                    BigInteger m = new BigInteger(t1,10);
                    if(n.compareTo(m)<0)
                    {
                        if(t1.compareTo("11") == 0) t1 = "9";
                        else if(t1.compareTo("101") == 0) t1 = "99";
                        else{
                            m = new BigInteger(t2,10);
                            m = m.subtract(BigInteger.ONE);
                            if(m.compareTo(BigInteger.ZERO) == 0){
                                t1 = "";
                                t1 += t.charAt(lenth/2);
                            }
                            else{
                                t2 = "";
                                t2+=m.toString();
                                mid = t2.length()-1; 
                                t1 = t2;
                                if(lenth%2 != 0)
                                t1 += t.charAt(lenth/2);
                                for(int i = mid;i>=0;i--)   t1+=t2.charAt(i);
                            }
                        }
                    }
                //
                ans+=1;
                s[ans] = t1;
                m = new BigInteger(t1,10);
                n = n.subtract(m);
            }
            System.out.println("Case #"+Case+":");
                    System.out.println(ans);
                    for(int i = 1;i<=ans;i++) System.out.println(s[i]);
        }
    }
}