用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);
}
}