天天看點

java大數(BigInteger)java中的數學計算函數

JAVA之BigInteger

Java

來處理高精度問題,相信對很多ACMer來說都是一件很happy的事,簡單易懂。用Java刷了一些題,感覺Java還不錯,在處理高精度和進制轉換中,調用庫函數的來處理。下面是寫的一些Java中一些基本的函數的及其……

頭檔案:import java.io.*;

import java.util.*;

import java.math.*;

讀入: Scanner cin = Scanner (System.in);

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

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

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

輸出: System.out.print(n);//列印n

System.out.println();//換行

System.out.printf("%d\n",n);//也可以類似c++裡的輸出方式

定義: int i,j,k,a[];

a = new int[100];

BigInteger n,m;

BigDecimal n;

String s;

資料類型:

資料類型 類型名 位長 取值範圍 預設值

布爾型 boolean 1 true,false false

位元組型 byte 8 -128-127 0

字元型 char 16 ‘\u000’-\uffff ‘\u0000’

短整型 short 16 -32768-32767 0

整型 int 32 -2147483648,2147483647 0

長整型 long 64 -9.22E18,9.22E18 0

浮點型 float 32 1.4E-45-3.4028E+38 0.0

雙精度型 double 64 4.9E-324,1.7977E+308 0.0

這裡特别要提出出的兩種類型:

BigInteger 任意大的整數,原則上是,隻要你的計算機的記憶體足夠大,可以有無限位的

BigDecimal 任意大的實數,可以處理小數精度問題。

BigInteger中一些常見的函數:

A=BigInteger.ONE

B=BigInteger.TEN

C=BigInteger.ZERO

一些常見的數的賦初值。将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);

java中的數學計算函數

 Math類:

  java.lang.Math類中包含基本的數字操作,如指數、對數、平方根和三角函數。

  java.math是一個包,提供用于執行任意精度整數(BigInteger)算法和任意精度小數(BigDecimal)算法的類。

  java.lang.Math類中包含E和PI兩個靜态常量,以及進行科學計算的類(static)方法,可以直接通過類名調用。

  public static final Double E = 2.7182818284590452354

  public static final Double PI = 3.14159265358979323846

  public static long abs(double x):傳回 x 的絕對值。X也可int long float

  public static long sin(double x): 傳回x徑度的正弦函數值 

  public static long cos(double x):傳回x徑度的餘弦函數值  

  public static long tan(double x): 傳回x徑度的正切函數值

  public static long asin(double x):傳回x值的反正弦函數值。

  public static long acos(double x):傳回x值的反餘弦函數值。

  public static long atan(double x):傳回x值的反正切函數值。

  public static long atan2(double x, double y):傳回極坐标(polar)的θ值

  public static long floor(double x):傳回不大于x的最大整數值

  public static long ceil(double x):傳回不小于x的最小整數值。

  public static long exp(double x):傳回相當于ex值

  public static long log(double x):傳回x的自然對數函數值

  public static long max(double x,double y):傳回x、y較大數

  public static long min(double x,double y):傳回x、y較小數

  public static long pow(double x,double y):傳回x的y次幂值

  public static long sqrt(double x): 傳回x開平方值

  public static long rint(double x):傳回最接近x的整數值

  public static long round(double x):傳回x的四舍五入值

  public static long toDegrees(double angrad):傳回将angrad徑度轉換成角度

  public static long toRadians(double angdeg): 傳回将angdeg角度轉換成徑度

  public static long random():傳回随機數值,産生一個0-1之間的随機數(不包括0和1)

NumberFormat類:

 

(public abstract class NumberFormat extends Format)

用java.text.NumberFormat類對輸出的數字結果進行必要的格式化。

  使用該類如下方法類執行個體化一個NumberFormat對象:

   public static final NumberFormat getInstance()

  然後用該對象調用如下方法可以格式化數字number(傳回字元串對象):

   public final String format(double number)

  NumberFormat類有如下常用方法:

  public void setMaximumFractionDigits(int newValue)//設定數的小數部分所允許的最大位數。

  public void setMaximumIntegerDigits(int newValue)//設定數的整數部分所允許的最大位數。

  public void setMinimumFractionDigits(int newValue)//設定數的小數部分所允許的最小位數。

  public void setMinimumIntegerDigits(int newValue)//設定數的整數部分所允許的最小位數。

  (更多方法及用法看JDK6API參考。)

 BigInteger類、BigDecimal類:

  java.math包中的BigInteger類和BigDecimal類分别提供任意精度的整數和小數運算。

  兩個類設計思想一樣,這裡隻對BigInterger類稍做介紹,細節可以檢視JDK6API參考。

  構造方法如下:

   BigInteger(String val)  //将 BigInteger 的十進制字元串表示形式轉換為 BigInteger。

   還有很多考慮周全的構造函數,建議要準備寫特殊需求的BigInteger前先認真翻下JDK。

  常用方法:

   abs()  //傳回其值是此BigInteger的絕對值的BigInteger。

   add(BigInteger val)  //傳回其值為(this+val)的BigInteger。

   subtract(BigInteger val)  //傳回其值為(this-val)的BigInteger。

   multiply(BigInteger val)  // 傳回其值為(this*val)的BigInteger。

   divide(BigInteger val)  //傳回其值為(this/val)的BigInteger。

   remainder(BigInteger val)  //傳回其值為(this%val)的BigInteger。

   compareTo(BigInteger val)  //将此BigInteger與指定的BigInteger進行比較。傳回值1、0、-1分别表示大于、等于、小于

   pow(int exponent)  //傳回目前大數的exponent次幂。

   toString()  //傳回此BigInteger的十進制字元串表示形式。

   toString(int radix)  //傳回此BigInteger的給定基數(radix進制)的字元串表示形式。

補充:

(1)abs():傳回某數字的絕對值.參數可以是float、double、long或int。如果是byte或short類型,那麼它們會被強制轉換成int類型。

(2)ceil()會找到下一個最大整數。例如參數為9.01時,傳回10.0。為-0.1時,傳回-0.0。傳回比參數大的整數,而且都是雙精度類型的。如果參數是整數,則該方法會傳回這個參數的雙精度型。

(3)floor()傳回緊鄰的最小整數。作用與ceil()正好相反,傳回的是比參數小的整數,而且都是雙精度型。如果參數為整數,則傳回這個參數的雙精度型。

(4)max()傳回兩個值中的最大值,隻支援float double long int 不支援byte short。

(5)min()傳回兩個值中的最小值,隻支援float double long int 不支援byte short。

(6)random()傳回一個随機數,一個在0.0到1.0之間的雙精度數。

(7)round()傳回與某浮點數值最接近的整數值。參數可以為double和folat兩種,而且支援四舍五入。例如:參數為9.01時,傳回9,參數為9.5時,傳回10,參數為-9.5時,傳回-9。

(8)sqrt()傳回某數值的平方根。如果該參數是"非數字"類型(NaN),或者小于零,則傳回是NaN。