zoukankan      html  css  js  c++  java
  • 关于C++ 标准输入输出 及 精度控制

    摘自牛客网一道题,如下:

    给定两个数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()!='
    '){   //对回车符做输入检查
    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类,用字符串来实现高精度表示和计算,转化为字符串打印。学到了。。

  • 相关阅读:
    POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
    POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
    POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
    POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
    HDU 4638 Group ★(树状数组)
    HDU 4638 Group ★(树状数组)
    HDU 4632 Palindrome subsequence (区间DP)
    HDU 4632 Palindrome subsequence (区间DP)
    hdu2604 Queuing
    poj3757 Training little cats
  • 原文地址:https://www.cnblogs.com/mangoczp/p/9568046.html
Copyright © 2011-2022 走看看