轉載自:http://www.cppblog.com/vontroy/archive/2010/05/24/116233.html
轉載自:http://www.cppblog.com/vontroy/archive/2010/05/24/116233.html<br />先說一下Java對於ACM的一些優點吧:<br />(1) 對於熟悉C/C++的程式員來說Java 並不難學,兩周時間基本可以搞定一般的編程,再用些時間瞭解一下Java庫就行了。<br />Java的文法和C++非常類似,可以說是C++的升級版,只是更加強調物件導向思想而已。(個人見解。。。)<br />(2) 在一般比賽中,Java程式會有額外的時間和空間,但真正進行大規模運算時Java並不比C/C++慢,<br />輸入輸出效率比較低而已<br />(3) Java 代碼簡單且功能強大,有些像高精度之類的演算法用Java實現起來更為簡潔方便<br />(ACM真正比賽時是講究做題速度的,任何題只要能過就行,而不必過於要求程式的速度有多高,不逾時就好)。<br />***小技巧:某些題目用Java逾時的話可以用Java打表然後用C/C++提交<br />(4) 用Java不易犯細微的錯誤,比如C/C++中的指標, “if (n = m) ... ” 等。<br />(5) 目前Eclipse已成基本配置,寫Java程式反而比C/C++更方便調試。在具體競賽時也算多一種選擇。<br />關於ACM中應用的一些問題:<br />(1) JDK 1.5.0 及其以上版本提供的Scanner類為輸入提供了良好的基礎,很好地最佳化Java的輸入問題。<br />代碼如下:<br />import java.io.* import java.util.*<br />public class Main<br />{<br /> public static void main(String args[])<br /> {<br /> Scanner cin = new Scanner(new BufferedInputStream(System.in));<br /> }<br />}<br />也可以直接 Scanner cin = new Scanner(System.in);<br />加Buffer可能會快一些。<br />(2) 讀一個整數: int n = cin.nextInt();<br />相當於 scanf("%d", &n);<br />或 cin >> n;<br />讀一個字串:String s = cin.next();<br />相當於 scanf("%s", s);<br />或 cin >> s;<br />讀一個浮點數:double t = cin.nextDouble();<br />相當於 scanf("%lf", &t);<br />或 cin >> t;<br />讀一整行: String s = cin.nextLine();<br />相當於 gets(s);<br />或 cin.getline(...);<br />判斷是否有下一個輸入可以用 cin.hasNext() 或 cin.hasNextInt() 或 cin.hasNextDouble()<br />(3) 輸出一般可以直接用 System.out.print() 和 System.out.println(),前者不輸出換行,而後者輸出。<br />System.out.println(n); // n 為 int 型 同一行輸出多個整數可以用<br />System.out.println(new Integer(n).toString() + " " + new Integer(m).toString());<br />//也可重新定義:<br />static PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out));<br />cout.println(n);<br />(4)對於輸出浮點數保留幾位小數的問題,可以使用DecimalFormat類,<br />import java.text.*;<br />DecimalFormat f = new DecimalFormat("#.00#");<br />DecimalFormat g = new DecimalFormat("0.000");<br />double a = 123.45678, b = 0.12;<br />System.out.println(f.format(a));<br />System.out.println(f.format(b));<br />System.out.println(g.format(b));<br />大數:<br />BigInteger 和 BigDecimal 是在java.math包中已有的類,前者表示整數,後者表示浮點數<br />import java.math.* // 需要引入 java.math 包<br />BigInteger a = BigInteger.valueOf(100);<br />BigInteger b = BigInteger.valueOf(50);<br />BigInteger c = a.add(b) // c = a + b;<br />//主要有以下方法可以使用:<br />BigInteger add(BigInteger other)<br />BigInteger subtract(BigInteger other)<br />BigInteger multiply(BigInteger other)<br />BigInteger divide(BigInteger other)<br />BigInteger mod(BigInteger other)<br />int compareTo(BigInteger other)<br />static BigInteger valueOf(long x)<br />//輸出數字時直接使用 System.out.println(a) 即可<br />字串:<br />String 類用來儲存字串,可以用charAt方法來取出其中某一位元組,計數從0開始:<br />String a = "Hello"; // a.charAt(1) = 'e'<br />用substring方法可得到子串,如上例<br />System.out.println(a.substring(0, 4)) // output "Hell"<br />注意第2個參數位置上的字元不包括進來。這樣做使得 s.substring(a, b) 總是有 b-a個字元。<br />字串串連可以直接用 + 號,如<br />String a = "Hello";<br />String b = "world";<br />System.out.println(a + ", " + b + "!"); // output "Hello, world!"<br />如想直接將字串中的某位元組改變,可以使用另外的StringBuffer類。<br />調用遞迴(或其他動態方法)<br />在主類中 main 方法必須是 public static void 的,在 main 中調用非static類時會有警告資訊,<br />可以先建立對象,然後通過對象調用方法:<br />public class Main<br />{<br /> void dfs(int a)<br /> {<br /> if () return;<br /> dfs(a+1);<br /> }<br /> public static void main(String args[])<br /> {<br /> Main e = new Main();<br /> e.dfs(0);<br /> }<br />}<br />其他注意的事項:<br />(1) Java 是物件導向的語言,思考方法需要變換一下,裡面的函數統稱為方法,不要搞錯。<br />(2) Java 裡的數組有些變動,多維陣列的內部其實都是指標,所以Java不支援fill多維陣列。<br />數組定義後必須初始化,如 int[] a = new int[100];<br />(3) 布爾類型為 boolean,只有true和false二值,在 if (...) / while (...) 等語句的條件中必須為boolean類型。<br /> 在C/C++中的 if (n % 2) ... 在Java中無法編譯通過。<br />(4) 下面在java.util包裡Arrays類的幾個方法可替代C/C++裡的memset、qsort/sort 和 bsearch:<br />Arrays.fill()<br />Arrays.sort()<br />Arrays.binarySearch()<br />雖然Java功能很強大,但不能完全依賴他,畢竟C和C++還是ACM/ICPC的主流語言,<br />適當地使用才能有效提高比賽中的成績。。。<br />附:<br />例題:POJ 1001<br />import java.io.*;<br />import java.util.*;<br />import java.math.BigDecimal;<br />public class Main<br />{<br /> public static void main(String args[])<br /> {<br /> Scanner cin = new Scanner(System.in);<br /> BigDecimal num;<br /> int n;<br /> String r;<br /> while (cin.hasNextBigDecimal())<br /> {<br /> num = cin.nextBigDecimal();<br /> n = cin.nextInt();<br /> num = num.pow(n);<br /> r = num.stripTrailingZeros().toPlainString();<br /> if (r.startsWith("0.")) r = r.substring(1);<br /> System.out.println(r);<br /> }<br /> }<br />}<br />