【高精度 JAVA】HDU 5920 Ugly Problem
題意
給你一個數字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