演算法導論學習之補漏:高精度冪運算

趙明威發表於2016-06-18

求高精度冪

Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 157463 Accepted: 38343
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

import java.io.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Created by zhaomingwei on 2016/3/10.
 */
public class BigDec2 {
public static void main(String[] args) throws IOException {
    //接收輸入陣列:
    List inStrs  = new ArrayList();
    //輸入
    Scanner scanner = new Scanner(System.in);
    //輸入資料
    String inStr = scanner.nextLine();
    //windows下換行符  f**k
    while(!("\r\n".equals(inStr)||"\\n".equals(inStr)||inStr.trim().length()<9)){
        inStrs.add(inStr);
        inStr = scanner.nextLine();
    }

    for(int i = 0; i<inStrs.size(); i++){
        String str = (String) inStrs.get(i);
        //判斷格式
        if (str.length()!=9){
            System.out.println("輸入字串格式錯誤!長度應該為9,實際為:"+str.length());
            return;
        }
        //R 和 n
        String inDouble = str.substring(0,6);
        String nInt = str.substring(7,9);
        if(inDouble==null){
            System.out.println("輸入字串格式錯誤!");
            return;
        }
        if(nInt==null){
            System.out.println("輸入字串格式錯誤!");
            return;
        }

        //轉化為對應的 BigDecimal 和 int 型別
        BigDecimal bigDecR = new BigDecimal(inDouble.trim());
        int n = Integer.parseInt(nInt.trim());

        //判斷範圍是否合理
        if (bigDecR.compareTo(BigDecimal.valueOf(99.999)) >= 0
                || bigDecR.compareTo(BigDecimal.valueOf(0))<=0){
            System.out.println("R的範圍錯誤,請輸入範圍在(0<R<99.999): "+bigDecR);
            return;
        }
        if (n>25||n<0){
            System.out.println("n範圍錯誤請輸入範圍在(0<R<25): "+n);
            return;
        }

        //做乘方
        BigDecimal powerResult = bigDecR.pow(n);
        //也可以自己寫乘方演算法
        //BigDecimal powerResult = power(bigDecR,n);
        //去除科學計數法
        String strResult = powerResult.toPlainString();
        strResult = strResult.replaceAll("^0+","").replaceAll("\\.0+$","");
        //去除前導0 ^0+  和 整數小數點 \.0+$  後面不需要的0 .\
        if (strResult.contains(".")){
            strResult = strResult.replaceAll("0+$","");
        }
        System.out.println(strResult);
    }

}

public static BigDecimal power(BigDecimal decimal,int n){
    BigDecimal result = new BigDecimal(1.0);
    for(int i=0; i<n; i++){
        result = result.multiply(decimal);
    }

    return result;
}
}

POJ測試結果:

Memory: 3192K        Time: 141MS  
Language: Java        Result: Accepted  

最近申請了微信公眾號,希望大家來看看,專門為程式設計師而生,做最好的程式設計
高斯

相關文章