求高精度冪
| Time Limit: 500MS |
|
Memory Limit: 10000K |
| Total Submissions: 120785 |
|
Accepted: 29494 |
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 120.4321 205.1234 156.7592 998.999 101.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.126825030131969720661201
Source
第一種方法
import java.io.*;import java.math.BigDecimal;import java.util.*;/* * @author denghuilong * * 2013-8-9上午12:58:50 **/public class Main {public static void main(String[] args) {Scanner sc=new Scanner(new BufferedInputStream(System.in));while(sc.hasNextBigDecimal()){BigDecimal r=sc.nextBigDecimal();int n=sc.nextInt();String s=r.pow(n).stripTrailingZeros().toPlainString();if(s.charAt(0)=='0')s=s.substring(1);System.out.println(s);}}}
第二種方法
快速冪
import java.io.*;import java.math.BigDecimal;import java.math.BigInteger;import java.util.*;import sun.nio.cs.ext.Big5_Solaris;/* * @author denghuilong * * 2013-8-8下午1:53:57 **/public class Main {public static void main(String[] args) {Scanner sc=new Scanner(new BufferedInputStream(System.in));while(sc.hasNextBigDecimal()){BigDecimal bd=sc.nextBigDecimal();int n=sc.nextInt();BigDecimal b=pow(bd,n);String s=b.stripTrailingZeros().toPlainString();if(s.startsWith("0")){s=s.substring(1);}System.out.println(s);}}// 快速冪public static BigDecimal pow(BigDecimal bd,int n){BigDecimal sum=BigDecimal.ONE;BigDecimal big=bd;while(n!=0){if((n&1)==1){sum=sum.multiply(big);}big=big.multiply(big);n>>=1;}return sum;}}