JAVA之BigInteger

Java來(lái)處理高精度問(wèn)題,相信對(duì)很多ACMer來(lái)說(shuō)都是一件很happy的事,簡(jiǎn)單易懂。用Java刷了一些題,感覺(jué)Java還不錯(cuò),在處理高精度和進(jìn)制轉(zhuǎn)換中,調(diào)用庫(kù)函數(shù)的來(lái)處理。下面是寫(xiě)的一些Java中一些基本的函數(shù)的及其……

頭文件:import java.io.*;

import java.util.*;

import java.math.*;

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

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

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

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

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

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

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

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

a = new int[100];

BigInteger n,m;

BigDecimal n;

String s;

數(shù)據(jù)類(lèi)型:

數(shù)據(jù)類(lèi)型 類(lèi)型名 位長(zhǎng) 取值范圍 默認(rèn)值

布爾型 boolean 1 true,false false

字節(jié)型 byte 8 -128-127 0

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

短整型 short 16 -32768-32767 0

整型 int 32 -2147483648,2147483647 0

長(zhǎng)整型 long 64 -9.22E18,9.22E18 0

浮點(diǎn)型 float 32 1.4E-45-3.4028E+38 0.0

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

這里特別要提出出的兩種類(lèi)型:

BigInteger 任意大的整數(shù),原則上是,只要你的計(jì)算機(jī)的內(nèi)存足夠大,可以有無(wú)限位的

BigInteger 任意大的實(shí)數(shù),可以處理小數(shù)精度問(wèn)題。

BigInteger中一些常見(jiàn)的函數(shù):

A=BigInteger.ONE

B=BigInteger.TEN

C=BigInteger.ZERO

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

基本的函數(shù):

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:公約數(shù),絕對(duì)值

negate:取負(fù)數(shù)

signum:符號(hào)函數(shù)

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:返回該數(shù)的最小二進(jìn)制補(bǔ)碼表示的位的個(gè)數(shù),即 *不包括* 符號(hào)位 (ceil(log2(this <0 ? -this : this + 1)))。對(duì)正數(shù)來(lái)說(shuō),這等價(jià)于普通二進(jìn)制表示的位的個(gè)數(shù)。

bitCount:返回該數(shù)的二進(jìn)制補(bǔ)碼表示中不包擴(kuò)符號(hào)位在內(nèi)的位的個(gè)數(shù)。該方法在 BigIntegers 之上實(shí)現(xiàn)位向量風(fēng)格的集合時(shí)很有用。

isProbablePrime:如果該 BigInteger 可能是素?cái)?shù),則返回 true ;如果它很明確是一個(gè)合數(shù),則返回 false 。 參數(shù) certainty 是對(duì)調(diào)用者愿意忍受的不確定性的度量:如果該數(shù)是素?cái)?shù)的概率超過(guò)了 1 - 1/2**certainty方法,則該方法返回 true 。執(zhí)行時(shí)間正比于參數(shù)確定性的值。

compareTo:根據(jù)該數(shù)值是小于、等于、或大于 val 返回 -1、0 或 1;

equals:判斷兩數(shù)是否相等,也可以用compareTo來(lái)代替;

min,max:取兩個(gè)數(shù)的較小、大者;

intValue,longValue,floatValue,doublue:把該數(shù)轉(zhuǎn)換為該類(lèi)型的數(shù)的值。

今天參考課本寫(xiě)了一個(gè)關(guān)于二進(jìn)制與十進(jìn)制轉(zhuǎn)換的程序,程序算法不難,但寫(xiě)完后測(cè)試發(fā)現(xiàn)不論是二轉(zhuǎn)十還是十轉(zhuǎn)二,對(duì)于大于21億即超過(guò)整數(shù)范圍的數(shù)不能很好的轉(zhuǎn)換。都會(huì)變成0.
參考書(shū)籍發(fā)現(xiàn)使用使用BigInteger可以解決這個(gè)問(wèn)題。
于是查找了下JDK,然后測(cè)試幾次終于寫(xiě)成功了!
使用心得如下:

1,BigInteger屬于java.math.BigInteger,因此在每次使用前都要import 這個(gè)類(lèi)。偶開(kāi)始就忘記import了,于是總提示找不到提示符。

2,其構(gòu)造方法有很多,但現(xiàn)在偶用到的有: BigInteger(String val)
將 BigInteger 的十進(jìn)制字符串表示形式轉(zhuǎn)換為 BigInteger。
BigInteger(String val, int radix)
將指定基數(shù)的 BigInteger 的字符串表示形式轉(zhuǎn)換為 BigInteger。
如要將int型的2轉(zhuǎn)換為BigInteger型,要寫(xiě)為BigInteger two=new BigInteger("2"); //注意2雙引號(hào)不能省略

3,BigInteger類(lèi)模擬了所有的int型數(shù)學(xué)操作,如add()==“+”,divide()==“-”等,但注意其內(nèi)容進(jìn)行數(shù)學(xué)運(yùn)算時(shí)不能直接使用數(shù)學(xué)運(yùn)算符進(jìn)行運(yùn)算,必須使用其內(nèi)部方法。而且其操作數(shù)也必須為BigInteger型。
如:two.add(2)就是一種錯(cuò)誤的操作,因?yàn)?沒(méi)有變?yōu)锽igInteger型。

4,當(dāng)要把計(jì)算結(jié)果輸出時(shí)應(yīng)該使用.toString方法將其轉(zhuǎn)換為10進(jìn)制的字符串,詳細(xì)說(shuō)明如下:
String toString()
返回此 BigInteger 的十進(jìn)制字符串表示形式。
輸出方法:System.out.print(two.toString());

5,另外說(shuō)明三個(gè)個(gè)用到的函數(shù)。 BigInteger remainder(BigInteger val)
返回其值為 (this % val) 的 BigInteger。
BigInteger negate()
返回其值是 (-this) 的 BigInteger。
int compareTo(BigInteger val)
將此 BigInteger 與指定的 BigInteger 進(jìn)行比較。
remainder用來(lái)求余數(shù)。
negate將操作數(shù)變?yōu)橄喾磾?shù)。
compare的詳解如下:

compareTo
public int compareTo(BigInteger val)將此 BigInteger 與指定的 BigInteger 進(jìn)行比較。對(duì)于針對(duì)六個(gè)布爾比較運(yùn)算符 (<, ==, >, >=, !=, <=) 中的每一個(gè)運(yùn)算符的各個(gè)方法,優(yōu)先提供此方法。執(zhí)行這些比較的建議語(yǔ)句是:(x.compareTo(y) <op> 0),其中 <op> 是六個(gè)比較運(yùn)算符之一。
指定者:
接口 Comparable<BigInteger> 中的 compareTo
參數(shù):
val - 將此 BigInteger 與之比較的 BigInteger。
返回:

將BigInteger的數(shù)轉(zhuǎn)為2進(jìn)制:

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