演算法導論學習之補漏:高精度冪運算
求高精度冪
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
最近申請了微信公眾號,希望大家來看看,專門為程式設計師而生,做最好的程式設計
相關文章
- 演算法導論學習之補漏:斐波那契數列演算法
- 演算法導論學習之五:快速排序演算法排序
- 演算法導論學習之六:歸併排序演算法排序
- JavaScript 冪運算JavaScript
- 《演算法導論》學習筆記演算法筆記
- javascript 冪函式運算JavaScript函式
- 【POWER】Oracle的冪運算Oracle
- 模冪運算-要求演算法返回冪運算a^b的計算結果與1337取模後的結果演算法
- 演算法導論學習之二:插入排序演算法排序
- 演算法導論學習之一:氣泡排序演算法排序
- [學習筆記]TypeScript查缺補漏(一):類筆記TypeScript
- 學習位運算
- 演算法之位運算演算法
- 取冪運算--C語言描述C語言
- 學習筆記----快速冪取模演算法筆記演算法
- 演算法之美 : 位運算演算法
- 從零開書學演算法(導論)之歸併排序演算法排序
- 演算法學習:矩陣快速冪/矩陣加速演算法矩陣
- Go語言學習查缺補漏ing Day8Go
- Go語言學習查缺補漏ing Day6Go
- Go語言學習查缺補漏ing Day7Go
- Go語言學習查缺補漏ing Day3Go
- Go語言學習查缺補漏ing Day4Go
- Go語言學習查缺補漏ing Day5Go
- Go語言學習查缺補漏ing Day1Go
- Go語言學習查缺補漏ing Day2Go
- C語言學習筆記之指標的運算C語言筆記指標
- 學演算法要讀《演算法導論》嗎?演算法
- 史蒂芬斯與演算法導論之思演算法
- mysql補漏MySql
- 利用字串實現高精度數值運算(四)字串
- 利用字串實現高精度數值運算(三)字串
- 利用字串實現高精度數值運算(二)字串
- 利用字串實現高精度數值運算(一)字串
- 《演算法導論》演算法
- 計算機導論計算機
- 演算法導論學習--紅黑樹詳解之刪除(含完整紅黑樹程式碼)演算法
- 演算法導論第二章練習演算法