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而設的。 

一般用法爲: 

import java.io.* 
import java.util.* 

public class Main 

     public static void main(String args[]) 
     { 
         Scanner cin = new Scanner(new BufferedInputStream(System.in)); 
         ... 
     } 


當然也可以直接 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類, 

import java.text.*; 
DecimalFormat f = new DecimalFormat("#.00#"); 
DecimalFormat g = new DecimalFormat("0.000"); 
double a = 123.45678, b = 0.12; 
System.out.println(f.format(a)); 
System.out.println(f.format(b)); 
System.out.println(g.format(b)); 

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


2. 大數字 

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

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

(import java.math.*)   // 需要引入 java.math 包 

BigInteger a = BigInteger.valueOf(100); 
BigInteger b = BigInteger.valueOf(50); 
BigInteger c = a.add(b)   // c = a + b; 

主要有以下方法可以使用: 
BigInteger add(BigInteger other) 
BigInteger subtract(BigInteger other) 
BigInteger multiply(BigInteger other) 
BigInteger divide(BigInteger other) 
BigInteger mod(BigInteger other) 
int compareTo(BigInteger other) 
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類時會有警告信息, 
可以先建立對象,然後通過對象調用方法: 

public class Main 

     ... 

     void dfs(int a) 
     { 
         if (...) return; 
         ... 
         dfs(a+1); 
     } 
     
     public static void main(String args[]) 
     { 
         ... 
         Main e = new Main(); 
         e.dfs(0); 
         ... 
     } 


5. 其他注意的事項 

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

(2) Java 裏的數組有些變動,多維數組的內部其實都是指針,所以Java不支持fill多維數組。 
     數組定義後必須初始化,如 int[] a = new int[100]; 

(3) 布爾類型爲 boolean,只有true和false二值,在 if (...) / while (...) 等語句的條件中必須爲boolean類型。 
     在C/C++中的 if (n % 2) ... 在Java中無法編譯通過。 

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

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