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; } }