Preface:
平常在寫程式處理數字一般使用 int 就夠了, 某些特殊情況可能會用到 long, 但沒想到會在解 2014 Google Campus Contest 遇到 java.lang.NumberFormatException! 原因是我試圖使用Long.valueOf() 函數解析字串 "16263054952801281548", 而這個數字已經遠遠超過 Long 的最大值 "9,223,372,036,854,775,807"! 所以有下面的 BigInteger 的介紹.
BigInteter 的使用介紹:
當遇到數字無法使用 Long 表示時, 通常只剩下使用 2 進位來表示大整數. 底下是針對 BigInteger 類別的描述:
既然數字已經大到沒法使用 Long 表示, 哪怎麼把數字傳給 BigInteger? 答案是透過字串. 常使用的建構子有:
所以剛剛不能處理的數字 "16263054952801281548" 便可以如下處理:
執行結果:
接著如果你要對 "大" 數字進行加減乘除, 不能使用直覺的 "+-*/", 而必須透過 BigInteger 類別上面的方法:
執行結果:
而常用的 Math.pow() 函數也可以使用 BigInteger 完成:
執行結果:
Supplement:
* Java Tutorial > Primitive Data Types
* Blog> java处理大整数
平常在寫程式處理數字一般使用 int 就夠了, 某些特殊情況可能會用到 long, 但沒想到會在解 2014 Google Campus Contest 遇到 java.lang.NumberFormatException! 原因是我試圖使用Long.valueOf() 函數解析字串 "16263054952801281548", 而這個數字已經遠遠超過 Long 的最大值 "9,223,372,036,854,775,807"! 所以有下面的 BigInteger 的介紹.
BigInteter 的使用介紹:
當遇到數字無法使用 Long 表示時, 通常只剩下使用 2 進位來表示大整數. 底下是針對 BigInteger 類別的描述:
既然數字已經大到沒法使用 Long 表示, 哪怎麼把數字傳給 BigInteger? 答案是透過字串. 常使用的建構子有:
所以剛剛不能處理的數字 "16263054952801281548" 便可以如下處理:
- String bigIntStr = "16263054952801281548";
- BigInteger a = new BigInteger(bigIntStr);
- System.out.printf("%s > %d\n", a, Long.MAX_VALUE);
- System.out.printf("'%s' binary = %s\n", a, a.toString(2));
接著如果你要對 "大" 數字進行加減乘除, 不能使用直覺的 "+-*/", 而必須透過 BigInteger 類別上面的方法:
- BigInteger btwo = new BigInteger("2");
- System.out.printf("%s+1=%s\n", a, a.add(BigInteger.ONE));
- System.out.printf("%s-1=%s\n", a, a.subtract(BigInteger.ONE));
- System.out.printf("%s*2=%s\n", a, a.multiply(btwo));
- System.out.printf("%s/2=%s\n", a, a.divide(btwo));
而常用的 Math.pow() 函數也可以使用 BigInteger 完成:
- System.out.printf("2^100=%s\n", btwo.pow(100));
Supplement:
* Java Tutorial > Primitive Data Types
* Blog> java处理大整数
沒有留言:
張貼留言