1. 程式人生 > >Java大數處理_用法整理

Java大數處理_用法整理

Ⅰ基本函式:

1.valueOf(parament); 將引數轉換為制定的型別

比如 int a=3;

       BigInteger b=BigInteger.valueOf(a);

b=3;

         String s=”12345”;

       BigInteger c=BigInteger.valueOf(s);

c=12345;

2.add(); 大整數相加

   BigInteger a=new BigInteger(“23”);

   BigInteger b=new BigInteger(“34”);

a.      add(b);

3.subtract(); 相減

4.multiply(); 相乘

5.divide();    相除取整

6.remainder(); 取餘

7.pow();   a.pow(b)=a^b

8.gcd();   最大公約數

9.abs(); 絕對值

10.negate(); 取反數

11.mod(); a.mod(b)=a%b=a.remainder(b);

12.max(); min();

13.punlic int comareTo();

14.boolean equals(); 是否相等

15.BigInteger建構函式:

   一般用到以下兩種:

   BigInteger(String val);

將指定字串轉換為十進位制表示形式;

   BigInteger(String val,int radix);

將指定基數的 BigInteger 的字串表示形式轉換為 BigInteger

Ⅱ.基本常量:

   A=BigInteger.ONE    1

B=BigInteger.TEN    10

C=BigInteger.ZERO   0

Ⅲ.基本操作

1.   讀入:

用Scanner類定義物件進行控制檯讀入,Scanner類在java.util.*包中

Scanner cin=new Scanner(System.in);// 讀入

while(cin.hasNext())   //等同於!=EOF

{

   int n;

   BigInteger m;

   n=cin.nextInt(); //讀入一個int;

   m=cin.BigInteger();//讀入一個BigInteger;

System.out.print(m.toString());

}

Ⅳ.運用

四則預算:

import java.util.Scanner;
import java.math.*;
import java.text.*;

public class Main
{
public static void main(String args[])
{
   Scanner cin = new Scanner ( System.in );
   BigInteger a,b;
   int c;
   char op;
   String s;

     while( cin.hasNext() )


   {
    a = cin.nextBigInteger();
    s = cin.next();
    op = s.charAt(0);
    if( op == '+')
    {
     b = cin.nextBigInteger();
     System.out.println(a.add(b));
    }
    else if( op == '-')
    {
     b = cin.nextBigInteger();
     System.out.println(a.subtract(b));
    }
    else if( op == '*')
    {
     b = cin.nextBigInteger();
     System.out.println(a.multiply(b));
    }
    else
    {
     BigDecimal a1,b1,eps;
     String s1,s2,temp;
     s1 = a.toString();
       a1 = new BigDecimal(s1);
     b = cin.nextBigInteger();
     s2 = b.toString();
     b1 = new BigDecimal(s2);
     c = cin.nextInt();
     eps = a1.divide(b1,c,4);
     //System.out.println(a + " " + b + " " + c);
     //System.out.println(a1.doubleValue() + " " + b1.doubleValue() + " " + c);
     System.out.print( a.divide(b) + " " + a.mod(b) + " ");
     if( c != 0)
     {
      temp = "0.";
      for(int i = 0; i < c; i ++) temp += "0";
      DecimalFormat gd = new DecimalFormat(temp);
      System.out.println(gd.format(eps));
     }
     else System.out.println(eps);
    }
   }
   }
}

補充:

        a=a.pow(b);
        a=a.stripTrailingZeros();
         d=a.toPlainString();
        if(d.charAt(0)=='0') d=d.substring(1);

Scanner cin = Scanner (System.in);

while(cin.hasNext())//等價於!=EOF

n=cin.nextInt();//讀入一個int型的數

n=cin.nextBigInteger();//讀入一個大整數

一些常見的數的賦初值。將int型的數賦值給BigInteger,BigInteger.valueOf(k);

基本的函式:

valueOf:賦初值

add:+ a.add(b);

subtract:-

multiply:*

divide:/

remainder:this % val

divideAndRemainder:a[0]=this / val; a[1]=this % val

pow:a.pow(b)=a^b

gcd,abs:公約數,絕對值

negate:取負數

signum:符號函式

mod:a.mod(b)=a%b;

shiftLeft:左移,this << n ,this*2^n;

shiftRight:右移,this >> n,this/2^n;

and:等同於c++的&&,且;

or:||,或;

xor:異或,BigInteger xor(BigInteger val),this^val

not:!,非;

bitLength:返回該數的最小二進位制補碼錶示的位的個數,即 *不包括* 符號位 (ceil(log2(this <0 ? -this : this + 1)))。對正數來說,這等價於普通二進位制表示的位的個數。

bitCount:返回該數的二進位制補碼錶示中不包擴符號位在內的位的個數。該方法在 BigIntegers 之上實現位向量風格的集合時很有用。

isProbablePrime:如果該 BigInteger 可能是素數,則返回 true ;如果它很明確是一個合數,則返回 false 。 引數 certainty 是對呼叫者願意忍受的不確定性的度量:如果該數是素數的概率超過了 1 - 1/2**certainty方法,則該方法返回 true 。執行時間正比於引數確定性的值。

compareTo:根據該數值是小於、等於、或大於 val 返回 -1、0 或 1;

equals:判斷兩數是否相等,也可以用compareTo來代替;

min,max:取兩個數的較小、大者;

intValue,longValue,floatValue,doublue:把該數轉換為該型別的數的值。

今天參考課本寫了一個關於二進位制與十進位制轉換的程式,程式演算法不難,但寫完後測試發現不論是二轉十還是十轉二,對於大於21億即超過整數範圍的數不能很好的轉換。都會變成0.
參考書籍發現使用使用BigInteger可以解決這個問題。
於是查找了下JDK,然後測試幾次終於寫成功了!
使用心得如下:

1,BigInteger屬於java.math.BigInteger,因此在每次使用前都要import 這個類。偶開始就忘記import了,於是總提示找不到提示符。

2,其構造方法有很多,但現在偶用到的有: BigInteger(String val)
將 BigInteger 的十進位制字串表示形式轉換為 BigInteger。
BigInteger(String val, int radix)
將指定基數的 BigInteger 的字串表示形式轉換為 BigInteger。
如要將int型的2轉換為BigInteger型,要寫為BigInteger two=new BigInteger("2"); //注意2雙引號不能省略

3,BigInteger類模擬了所有的int型數學操作,如add()==“+”,divide()==“-”等,但注意其內容進行數學運算時不能直接使用數學運算子進行運算,必須使用其內部方法。而且其運算元也必須為BigInteger型。
如:two.add(2)就是一種錯誤的操作,因為2沒有變為BigInteger型。

4,當要把計算結果輸出時應該使用.toString方法將其轉換為10進位制的字串,詳細說明如下:
String toString()
返回此 BigInteger 的十進位制字串表示形式。
輸出方法:System.out.print(two.toString());

5,另外說明三個個用到的函式。 BigInteger remainder(BigInteger val)
返回其值為 (this % val) 的 BigInteger。
BigInteger negate()
返回其值是 (-this) 的 BigInteger。
int compareTo(BigInteger val)
將此 BigInteger 與指定的 BigInteger 進行比較。
remainder用來求餘數。
negate將運算元變為相反數。
compare的詳解如下:

compareTo
public int compareTo(BigInteger val)將此 BigInteger 與指定的 BigInteger 進行比較。對於針對六個布林比較運算子 (<, ==, >, >=, !=, <=) 中的每一個運算子的各個方法,優先提供此方法。執行這些比較的建議語句是:(x.compareTo(y) <op> 0),其中 <op> 是六個比較運算子之一。
指定者:
介面 Comparable<BigInteger> 中的 compareTo
引數:
val - 將此 BigInteger 與之比較的 BigInteger。
返回:

將BigInteger的數轉為2進位制:

public class TestChange {
public static void main(String[] args) {
System.out.println(change("3",10,2));
}
//num 要轉換的數 from源數的進位制 to要轉換成的進位制
private static String change(String num,int from, int to){
return new java.math.BigInteger(num, from).toString(to);
}
}