2013年9月24日 星期二

[ Java 文章收集 ] BigInteger 的使用

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 類別的描述:
BigInteger 的所有操作中,都以二進制補碼形式表示 BigInteger(如 Java 的基本整數型別)。BigInteger 提供所有 Java 的基本整數操作符的對應物,並提供 java.lang.Math 的所有相關方法。另外,BigInteger 還提供以下運算:模算術、GCD 計算、質數測試、素數產生、位操作以及一些其他操作

既然數字已經大到沒法使用 Long 表示, 哪怎麼把數字傳給 BigInteger? 答案是透過字串. 常使用的建構子有:
- BigInteger(String val) : Translates the decimal String representation of a BigInteger into a BigInteger.
- BigInteger(String val, int radix) : Translates the String representation of a BigInteger in the specified radix into a BigInteger.

所以剛剛不能處理的數字 "16263054952801281548" 便可以如下處理:
  1. String bigIntStr = "16263054952801281548";  
  2. BigInteger a = new BigInteger(bigIntStr);  
  3. System.out.printf("%s > %d\n", a, Long.MAX_VALUE);  
  4. System.out.printf("'%s' binary = %s\n", a, a.toString(2));  
執行結果:
16263054952801281548 > 9223372036854775807
'16263054952801281548' binary = 1110000110110001111110100101000001110000011000001010011000001100

接著如果你要對 "大" 數字進行加減乘除, 不能使用直覺的 "+-*/", 而必須透過 BigInteger 類別上面的方法:
  1. BigInteger btwo = new BigInteger("2");  
  2. System.out.printf("%s+1=%s\n", a, a.add(BigInteger.ONE));  
  3. System.out.printf("%s-1=%s\n", a, a.subtract(BigInteger.ONE));  
  4. System.out.printf("%s*2=%s\n", a, a.multiply(btwo));  
  5. System.out.printf("%s/2=%s\n", a, a.divide(btwo));  
執行結果:
16263054952801281548+1=16263054952801281549
16263054952801281548-1=16263054952801281547
16263054952801281548*2=32526109905602563096
16263054952801281548/2=8131527476400640774

而常用的 Math.pow() 函數也可以使用 BigInteger 完成:
  1. System.out.printf("2^100=%s\n", btwo.pow(100));  
執行結果:
2^100=1267650600228229401496703205376

Supplement:
Java Tutorial > Primitive Data Types
Blog> java处理大整数


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...