摘自牛客网一道题,如下:
给定两个数R和n,输出R的n次方,其中0.0<R<99.999, 0<n<=25
输入描述:
多组测试用例,请参考例题的输入处理 输入每行一个浮点数 R 其中0.0 < R <99.999, 一个整数 n 其中0 < n <=25
输出描述:
输出R的n次方
输入例子1:
95.123 12 0.1 1
输出例子1:
548815620517731830194541.899025343415715973535967221869852721 0.1
我给出的代码如下:
1 #include <iostream> 2 #include <stdlib.h> 3 #include <cmath> 4 #include <iomanip> 5 6 using namespace std; 7 int main(){ 8 double base_num,pow_num; 9 cout<<"Please input:"<<endl; 10 11 while(cin.get()!='\n'){ //对回车符做输入检查 12 cin.unget(); 13 cin>>base_num; 14 cin>>pow_num; 15 if(base_num>=99.999 || base_num<=0.0 || pow_num<=0.0 || pow_num>25.0) 16 cout<<"error "; 17 else {cout<<fixed<<setprecision(30)<<pow(base_num,pow_num)<<" ";} 18 if(cin.good()!=true){break;} //非法检查,比如输出一些特殊字符时可以避免死循环 19 } 20 cout<<endl; 21 return 0; 22 }
但是问题是精度不符:
正确答案:
1 import java.math.BigDecimal; 2 import java.util.Scanner; 3 4 public class Main { 5 public static void main(String[] args) { 6 String r; 7 int n; 8 String s; 9 Scanner sc = new Scanner(System.in); 10 while(sc.hasNext()){ 11 r = sc.next(); //用string来存储,因为double和float都是不能准确的表示小数的,只是以概数来表示 12 n = sc.nextInt(); 13 BigDecimal d = new BigDecimal(r); 14 BigDecimal ans = new BigDecimal(r); 15 for(int i=1;i<n;i++){ 16 ans = ans.multiply(d); 17 } 18 s= ans.stripTrailingZeros().toPlainString(); // 去除不必要的零,转换为字符串,防止科学记数法 19 System.out.println(s); 20 } 21 22 } 23 }
用到BigDecimal类,用字符串来实现高精度表示和计算,转化为字符串打印。学到了。。