牛客网多校训练 酸碱滴定

题目描述    题目来源

有时候你会抱怨,什么时候才能到终点。
有时候你会迫不及待,怎么颜色还不改变。
滴定管长场的,我们的路长长的。
用心的放入每一滴,终点就在你手心。
今天小星需要去完成一个酸碱滴定实验。,实验室老师要求用 A mol/L 的HCL去测定一瓶NaOH的浓度。首先小星取出了一个锥形瓶,在里面放入的Bml的NaOH,并滴加1-2滴甲基橙,然后用HCL去滴定他 当滴定至恰好变为红色时(可以认为H离子浓度等于OH离子浓度),用了C ml
小星现在需要计算NaOH的浓度是多少?单位(mol/L)
对于浓度采用化学里“四舍六入五成双”方法保留2位小数
规则1 :第三位小数≤4 时舍去
规则2: 第三位小数≥6时进上
规则3: 第三位小数等于5时
3.1首先根据 5后面的数字来定,当5后有数时,舍5入1;
3.2当5后无有效数字时,需要分两种情况来讲:
    3.2.1   5前为奇数,舍5入1;
    3.2.2  5前为偶数,舍5不进(0是偶数
例如
9.8249=9.82    规则1 
9.82671=9.83  规则2
9.82501=9.83  规则3.1
9.8351 =9.84  规则3.1
9.8350=9.84    规则3.2.1
9.8250=9.82   规则3.2.2
 
 
 

输入描述:

输入第一行一个数T(T<=20)表示数据组数
对于每组数据输入 A,B,C三个3位小数
0.000<a,b,c<50.000

输出描述:

结果“四舍六入五成双”保留2位小数
示例1

输入

3
10.000 10.000 1.825
10.000 10.000 9.835
1.010 21.325 19.823

输出

1.82
9.84
0.94

说明

样例1中计算出的结果为 1.8250000000根据(规则3.2.2) 答案应该为1.82
9.835->9.84(规则3.2.1)

总结
printf的四舍五入还是有点问题的,他严格遵守四舍六入,五的时候不稳定
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;
void show(double ans)
{
    int k=ans*1000.0;
  //  cout<<k<<endl;
    if(k%10==5)
    {
        if(fabs(ans*1000.0-floor(ans*1000.0))>0.0000001)//这里考虑到浮点运算的误差问题
        {
//这里进一位,不能使用printf("%.2f/n",ans);因为printf对于第三位是5时,有时候会进,有时又不进 printf(
"%.2f\n",floor(ans*100.0)/100.0+0.01);//简单粗暴的将后面的剁掉在加一位,哈哈 } else if(k/10%10%2==1) { printf("%.2f\n",floor(ans*100.0)/100.0+0.01); } else { printf("%.2f\n",floor(ans*100.0)/100.0); } } else { printf("%.2f\n",ans);//当第三位不是5时printf是不会错的 } return; } int main() { double a,b,c; int n; while(cin>>n) { for(int i=0;i<n;i++) { cin>>a>>b>>c; show(a*c/b); } } return 0; }

 

posted @ 2018-02-15 16:49  czh~  阅读(165)  评论(0编辑  收藏  举报