ACM中java的使用(二)

Chapter I. 


Java的優缺點各種書上都有,這裏只說說用Java做ACM-ICPC的特點: 

(1) 最明顯的好處是,學會Java,可以參加Java Challenge    :) 

(2) 對於熟悉C/C++的程序員來說,Java 並不難學,找本書,一兩週業餘時間就可以搞定了。當然,這裏只是指一般編程,想熟悉所有的Java庫還是需要些時間的。 

      事實上,Java 只相當於C++的一個改進版,所有的語法都幾乎是C++的,很少有變動。 

(3) 在一般比賽中,Java程序會有額外的時間和空間,而實際上經過實驗,在執行計算密集任務的時候Java並不比C/C++慢多少,只是IO操作較慢而已。 

(4) Java 簡單而功能強大,有些東西用Java實現起來更爲方便,比如高精度。 

(5) Java不易犯細微的錯誤,比如C/C++中的指針, “if (n = m) ... ” 等 

(6) 目前來看Eclipse已成基本配置,寫Java程序反而比C/C++更方便調試。在具體競賽時也算多一種選擇。 

(7) 學會Java對以後工作有好處。現在國外很多地方會Java的人比會C/C++的人多。 

(8) Java可以使你看起來更像偶蹄類動物(牛)      hoho~ 


Chapter II. 


下面說一下ACM-ICPC隊員初用Java編程所遇到的一些問題: 

1. 基本輸入輸出: 

(1) 

JDK 1.5.0 新增的Scanner類爲輸入提供了良好的基礎,簡直就是爲ACM-ICPC而設的。 

一般用法爲: 

[java] view plain copy
 print?
  1. import java.io.*   
  2. import java.util.*   
  3. public class Main   
  4. {   
  5.       public static void main(String args[])   
  6.       {   
  7.           Scanner cin = new Scanner(new BufferedInputStream(System.in));   
  8.           ...   
  9.       }   
  10. }   


當然也可以直接 Scanner cin = new Scanner(System.in); 

只是加Buffer可能會快一些 

(2) 

讀一個整數:    int n = cin.nextInt();          相當於    scanf("%d", &n);    或 cin >> n; 

讀一個字符串:String s = cin.next();          相當於    scanf("%s", s);      或 cin >> s; 

讀一個浮點數:double t = cin.nextDouble();    相當於    scanf("%lf", &t); 或 cin >> t; 

讀一整行:      String s = cin.nextLine();      相當於    gets(s);            或 cin.getline(...); 

判斷是否有下一個輸入可以用 cin.hasNext() 或 cin.hasNextInt() 或 cin.hasNextDouble() 等,具體見 TOJ 1001 例程。 

(3) 

輸出一般可以直接用 System.out.print() 和 System.out.println(),前者不輸出換行,而後者輸出。 

比如:System.out.println(n);    // n 爲 int 型 

同一行輸出多個整數可以用 

      System.out.println(new Integer(n).toString() + " " + new Integer(m).toString()); 

也可重新定義: 

static PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out)); 

cout.println(n); 

(4) 

對於輸出浮點數保留幾位小數的問題,可以使用DecimalFormat類, 

[java] view plain copy
 print?
  1. import java.text.*;   
  2. DecimalFormat f = new DecimalFormat("#.00#");   
  3. DecimalFormat g = new DecimalFormat("0.000");   
  4. double a = 123.45678, b = 0.12;   
  5. System.out.println(f.format(a));   
  6. System.out.println(f.format(b));   
  7. System.out.println(g.format(b));   


這裏0指一位數字,#指除0以外的數字。 

2. 大數字 

BigInteger 和 BigDecimal 是在java.math包中已有的類,前者表示整數,後者表示浮點數 

用法: 

不能直接用符號如+-來使用大數字,例如: 

[java] view plain copy
 print?
  1. (import java.math.*)    // 需要引入 java.math 包   
  2. BigInteger a = BigInteger.valueOf(100);   
  3. BigInteger b = BigInteger.valueOf(50);   
  4. BigInteger c = a.add(b)    // c = a + b;   


主要有以下方法可以使用: 

[java] view plain copy
 print?
  1. BigInteger add(BigInteger other)   
  2. BigInteger subtract(BigInteger other)   
  3. BigInteger multiply(BigInteger other)   
  4. BigInteger divide(BigInteger other)   
  5. BigInteger mod(BigInteger other)   
  6. int compareTo(BigInteger other)   
  7. static BigInteger valueOf(long x)   


輸出大數字時直接使用 System.out.println(a) 即可。 

3. 字符串 

String 類用來存儲字符串,可以用charAt方法來取出其中某一字節,計數從0開始: 

String a = "Hello";      // a.charAt(1) = ’e’ 

substring方法可得到子串,如上例 

System.out.println(a.substring(0, 4))      // output "Hell" 

注意第2個參數位置上的字符不包括進來。這樣做使得 s.substring(a, b) 總是有 b-a個字符。 

字符串連接可以直接用 號,如 

String a = "Hello"; 

String b = "world"; 

System.out.println(a + ", " + b + "!");      // output "Hello, world!" 

如想直接將字符串中的某字節改變,可以使用另外的StringBuffer類。 

4. 調用遞歸(或其他動態方法) 

在主類中 main 方法必須是 public static void 的,在 main 中調用非static類時會有警告信息, 

可以先建立對象,然後通過對象調用方法: 

[java] view plain copy
 print?
  1. public class Main   
  2. {   
  3.       ...   
  4.       void dfs(int a)   
  5.       {   
  6.           if (...) return;   
  7.           ...   
  8.           dfs(a+1);   
  9.       }   
  10.        
  11.       public static void main(String args[])   
  12.       {   
  13.           ...   
  14.           Main e = new Main();   
  15.           e.dfs(0);   
  16.           ...   
  17.       }   
  18. }   


5. 其他注意的事項 

(1) Java 是面向對象的語言,思考方法需要變換一下,裏面的函數統稱爲方法,不要搞錯。 

(2) Java 裏的數組有些變動,多維數組的內部其實都是指針,所以Java不支持fill多維數組。 

      數組定義後必須初始化,如 int[] a = new int[100]; 

(3) 布爾類型爲 boolean,只有truefalse二值,在 if (...) / while (...) 等語句的條件中必須爲boolean類型。 

      在C/C++中的 if (n % 2) ... Java中無法編譯通過。 

(4) 下面在java.util包裏Arrays類的幾個方法可替代C/C++裏的memsetqsort/sort 和 bsearch: 

Arrays.fill() 

Arrays.sort() 

Arrays.binarySearch()  

轉自:http://hi.baidu.com/oak_wesley/blog/item/35839200fd9dc10e1d9583de.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章