JAVA大數值問題總結,JAVA數值問題總結
大數值問題:
如果基本的整數(如:int、long)和浮點數的精度不狗滿足需求時,那麼就可以用java.math包中的兩個類BigInteger(任意精度的整數)和BigDecimal(任意精度的浮點數).
這兩個類可以實現人一次長度數位數值
BigInteger a = BigInteger.valueOf(100);//把100轉換為大數類型的整數
使用valueOf()方法可以將普通的數值轉化為大數
那麼接下來,怎麼用大數實現數值運算呢?
在JAVA中提供加法方法就是:
BigInteger sum = a.add(b);//c = a + b;
BigInteger ji = a.multiply(b.add(BigInteger.valueOf(2)));//ji = a * ( b + 2)
註:
和C++不同,java只提供了字串的串連,重載了+運算子,java沒有提供運算子的重載功能,也沒有給java程式員在自己的類中寫運算子多載的機會。
計算群組合數:
c = c.multiply(BigInteger.valueOf(n-i+1).divide(BigInteger.valueOf(i)));//(n-i+1)/i
/** 描述: 有n個球,一手可以抓m個,問有多少抓取方式,n以0輸入結束 思路: 應用java.math包中的BigInteger類 運用a.multiply(b)得出a*b積 */import java.math.BigInteger;import java.util.Scanner;public class Main {public static void main(String[] args){Scanner in = new Scanner(System.in);int n = 1,m;//求C(m,n)的組合數while(0!=n){n = in.nextInt();m = in.nextInt();BigInteger c = BigInteger.valueOf(1);for(int i = 1;i<=m;i++){c = c.multiply(BigInteger.valueOf(n-i+1)).divide(BigInteger.valueOf(i));}System.out.println(c);}}}
BigInteger:
//BigInteger add(BigInteger it)// 求和//BigInteger subtract(BigInteger it) //求差//BigInteger multiply(BigInteger it) //求積//BigInteger divide(BigInteger it) //求商//BigInteger mod(BigInteger it) //求模//int compareTo (BigInteger it) //用於判斷兩個大數的大小,該大數與另一個大數it相等,返回0,小於,返回負,大於返回正//static BigInteger.valueOf(long x)static BigInteger valueOf(long xx)//傳回值 等於xx 的大整數
BigDecimal:
BigDecimal add(BigDecimal it)// 求和BigDecimal subtract(BigDecimal it) //求差BigDecimal multiply(BigDecimal it) //求積BigDecimal mod(BigDecimal it) //求模
例外:
BigDecimal divide(BigDecimal it RoundingMode mode)5.0//四捨五入想要計算必須要給出舍入方式,至於其他的舍入方式可以參考API文檔static BigDecimal valueOf(long x) //傳回值等於x的大實數static BigDecimal valueOf(long x,int k)//傳回值為 x/(10的k次方)的大實數
JAVA 大數值問題
題目是這樣的,計算100!+101!+……+200!
代碼如下:
import java.math.*;
public class No0305
{
public static void main(String args[])
{
BigInteger
first100=new BigInteger("100"),//初始化各個大整數
last201=new BigInteger("201"),
one=new BigInteger("1"),
power=new BigInteger("1"),
result=new BigInteger("0");
for (BigInteger i=one;i.compareTo(last201)<0;i=i.add(one))//迴圈累加從1到201
{
power=power.multiply(i);//求i!
if(i.compareTo(first100)>=0)//從100!開始加
result=result.add(power);
}
System.out.println(result.toString());
}
}
java程式 大數值的問題講解
import java.math.*;
import java.util.*;
這兩行是調用API文檔中現有的類,其實全稱可以按如下的方式寫:
import java.math.BigInteger;
import java.util.Scanner;
因為你調用的 BigInteger和Scanner方法是從上面的math和util包中調用的,所以必須指明,否則就會出錯。
Scanner in = new Scanner(System.in);
這個是一個要你輸入的語句。
在API文檔中說明如下:
Scanner 使用分隔字元模式將其輸入分解為標記,預設情況下該分隔字元模式與空白匹配。然後可以使用不同的 next 方法將得到的標記轉換為不同類型的值。
例如,以下代碼使使用者能夠從 System.in 中讀取一個數:
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
再看一個例子,以下代碼使 long 類型可以通過 myNumbers 檔案中的項分配:
Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) {
long aLong = sc.nextLong();
}
對於
BigInteger lotteryOdds = BigInteger.valueOf(1);
中的valueOf()方法,這個也是API文檔中的,方法如下:
valueOf
public static BigInteger valueOf(long val)返回其值等於指定 long 的值的 BigInteger。提供的此“靜態Factory 方法”優先於 (long) 構造方法,因為前者允許重用經常使用的 BigInteger。
參數:
val - 要返回的 BigInteger 的值。
返回:
具有指定值的 BigInteger。
-----------------------------------------
以上就是這個程式的關鍵點,其實沒有什麼知識點,就是查詢java的API文檔。
你應該是初學者吧,因為感覺還不會用文檔。那你就到網上搜尋API文檔,有中文和英文的,你下載後就慢慢學習使用,大約40多M。
API文檔是你學習java和以後java開發的必需具備的文檔。給你舉個例子,就你上面的程式,對於BigInteger類和valueOf()這個方法,我開始根本就不知道,但你在瞭解文檔後你就會使用了。在你編程的時候,你需要數學方法,那就一定得去
java.math的包中尋找,然後看每個類,這樣你就知道用哪個方法了。
記住:沒有誰能把API文檔中的方法都記住,而且也沒有意義去記住。API文檔就相當於字典。