1. 程式人生 > >【高精度 JAVA】HDU 5920 Ugly Problem

【高精度 JAVA】HDU 5920 Ugly Problem

cti == tin ati pri 包裝類 out class gin

題意

給你一個數字n(n < 10^1000),將其拆成若幹個回文串(不超過50個)輸出拆分方案

分析

不難想到,我們可以每次給n減一個小於他的最大的回文串,這樣能夠盡量構造出最少數量的回文串,方法可以使直接將前一半反轉貼到後一半,如果比原來的數字大,那麽前一半減少1,再反轉貼為後一半
比較坑的地方就是 如果構造出來的是11比n大, 那麽前一半-1變成了00 ,特判一下,應該為9;如果構造出來是101比n大,應該特判為99

這個題沒太多好講的,我想在這裏記錄一下java編程心得,以後也會更新

主體框架

import java.io.*; // 這個沒用過
import java.util.*;
import java.lang.*;
// import java.math.*; import java.text.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); } }

這裏的類名,在提交到oj上時,一定要取為Main,但是本機運行的時候,一定要取為和文件名相同的名字,否則會CE

輸入

int n = cin.nextInt(); //讀入一個整數
BigInteger n = cin.nextBigInteger(); // 讀入一個大整數
double
n = cin.nextDouble(); // 讀入一個浮點數 String n = cin.next(); // 讀入一個字符串

這裏看起來是很有規律可循的……

輸出

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.compare(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]);
        }
    }
}

【高精度 JAVA】HDU 5920 Ugly Problem