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
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
return;
}
if (n>25||n<0){
System.out.println("n范围错误请输入范围在(0
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
result = result.multiply(decimal);
}
return result;
}
}
POJ测试结果:
Memory: 3192K Time: 141MS
Language: Java Result: Accepted
最近申请了微信公众号,希望大家来看看,专门为程序员而生,做最好的程序设计