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. 1,BigInteger屬於java.math.BigInteger,因此在每次使用前都要import 這個類。偶開始就忘記import了,於是總提示找不到提示符。 2,其構造方法有很多,但現在偶用到的有: BigInteger(String val) 3,BigInteger類模擬了所有的int型數學操作,如add()==“+”,divide()==“-”等,但注意其內容進行數學運算時不能直接使用數學運算符進行運算,必須使用其內部方法。而且其操作數也必須為BigInteger型。 4,當要把計算結果輸出時應該使用.toString方法將其轉換為10進制的字符串,詳細說明如下: 5,另外說明三個個用到的函數。 BigInteger remainder(BigInteger val) compareTo 將BigInteger的數轉為2進制: public class TestChange { |
java中的數學計算函數
java.lang.Math類中包含基本的數字操作,如指數、對數、平方根和三角函數。
java.math是一個包,提供用於執行任意精度整數(BigInteger)算法和任意精度小數(BigDecimal)算法的類。
public static final Double PI = 3.14159265358979323846
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)
用java.text.NumberFormat類對輸出的數字結果進行必要的格式化。
使用該類如下方法類實例化一個NumberFormat對象:
public static final NumberFormat getInstance()
然后用該對象調用如下方法可以格式化數字number(返回字符串對象):
public final String format(double number)
public void setMaximumFractionDigits(int newValue)//設置數的小數部分所允許的最大位數。
public void setMaximumIntegerDigits(int newValue)//設置數的整數部分所允許的最大位數。
public void setMinimumFractionDigits(int newValue)//設置數的小數部分所允許的最小位數。
public void setMinimumIntegerDigits(int newValue)//設置數的整數部分所允許的最小位數。
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。