ACM中Java的應用

Java作ACM-ICPC的特色: 
(1) 在通常比賽中,Java程序會有額外的時間和空間,而實際上通過實驗,在執行計算密集任務的時候Java並不比C/C++慢多少,只是IO操做較慢而已。 
(2) Java 簡單而功能強大,有些東西用Java實現起來更爲方便,好比高精度。 
(3) 用Java不易犯細微的錯誤,好比C/C++中的指針, 「if (n = m) ... 」 等 
(4) 目前來看Eclipse已成基本配置,寫Java程序反而比C/C++更方便調試。在具體競賽時也算多一種選擇。 
(5) 學會Java對之後工做有好處。如今國外不少地方會Java的人比會C/C++的人多。 

下面說一下ACM-ICPC隊員初用Java編程所遇到的一些問題: 
1. 基本輸入輸出: 
(1) JDK 1.5.0 新增的Scanner類爲輸入提供了良好的基礎,簡直就是爲ACM-ICPC而設的。 

通常用法爲: java

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

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

固然也能夠直接 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) ide

對於輸出浮點數保留幾位小數的問題,可使用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)); 
View Code

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


2. 大數字 
BigInteger 和 BigDecimal 是在java.math包中已有的類,前者表示整數,後者表示浮點數 
用法: 
不能直接用符號如+、-來使用大數字,例如: 3d

(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) 
View Code

輸出大數字時直接使用 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類時會有警告信息, 
能夠先創建對象,而後經過對象調用方法:
 code

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); 
         ... 
     } 
} 
View Code

 

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() 

相關文章
相關標籤/搜索