1. 程式人生 > 實用技巧 >poj-1001 求高精度冪

poj-1001 求高精度冪

Description

對數值很大、精度很高的數進行高精度計算是一類十分常見的問題。比如,對國債進行計算就是屬於這類問題。

現在要你解決的問題是:對一個實數R( 0.0 < R < 99.999 ),要求寫程式精確計算 R 的 n 次方(Rn),其中n 是整數並且 0 < n <= 25。

Input

T輸入包括多組 R 和 n。 R 的值佔第 1 到第 6 列,n 的值佔第 8 和第 9 列。

Output

對於每組輸入,要求輸出一行,該行包含精確的 R 的 n 次方。輸出需要去掉前導的 0 後不要的 0 。如果輸出是整數,不要輸出小數點。

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

Submit
import java.math.BigDecimal;
import java.util.*;

public class _1001 {
    public static void main(String[] args) throws InterruptedException {
        // write your code here
        Scanner cin = new Scanner(System.in);
        while (cin.hasNext()) {
            BigDecimal a = cin.nextBigDecimal();
            
int b = cin.nextInt(); String res = a.pow(b).stripTrailingZeros().toPlainString(); res = (res.indexOf("0.") == 0) ? (res.substring(1)) : res; System.out.println(res); } } }
知識補充:

【BigDecimal是什麼?】


1、簡介
Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用java.math.BigDecimal。BigDecimal所建立的是物件,我們不能使用傳統的+、-、*、/等算術運算子直接對其物件進行數學運算,而必須呼叫其相對應的方法。方法中的引數也必須是BigDecimal的物件。構造器是類的特殊方法,專門用來建立物件,特別是帶有引數的物件。

2、構造器描述

BigDecimal(int) 建立一個具有引數所指定整數值的物件。
BigDecimal(double) 建立一個具有引數所指定雙精度值的物件。//不推薦使用,導致計算有問題
BigDecimal(long) 建立一個具有引數所指定長整數值的物件。
BigDecimal(String) 建立一個具有引數所指定以字串表示的數值的物件。//推薦使用,導致計算有問題

3、方法描述

add(BigDecimal) BigDecimal物件中的值相加,然後返回這個物件。
subtract(BigDecimal) BigDecimal物件中的值相減,然後返回這個物件。
multiply(BigDecimal) BigDecimal物件中的值相乘,然後返回這個物件。
divide(BigDecimal) BigDecimal物件中的值相除,然後返回這個物件。
toString() 將BigDecimal物件的數值轉換成字串。
doubleValue() 將BigDecimal物件中的值以雙精度數返回。
floatValue() 將BigDecimal物件中的值以單精度數返回。
longValue() 將BigDecimal物件中的值以長整數返回。
intValue() 將BigDecimal物件中的值以整數返回。

4、函式 toPlainString() 和 toString()

對於 BigDecimal b ;

b=(0.4321)^ 20;
String s = b.toPlainString() ;
System.out.println(s) ;
輸出為:
0.00000005148554641076956121994511276767154838481760200726351203835429763013462401

若String s = b.toString() ;
輸出為:
5.148554641076956121994511276767154838481760200726351203835429763013462401E-8

因此我們知道:toPlainString()返回不用科學計數法、toString()返回使用科學計數法

5、java中去掉BigDecimal後無用的零

使用stripTrailingZeros().toPlainString()

BigDecimal a=new BigDecimal("0.1000");
System.out.println(a.stripTrailingZeros().toPlainString());