牛客网多校训练 酸碱滴定
题目描述 题目来源
有时候你会抱怨,什么时候才能到终点。
有时候你会迫不及待,怎么颜色还不改变。
滴定管长场的,我们的路长长的。
用心的放入每一滴,终点就在你手心。
今天小星需要去完成一个酸碱滴定实验。,实验室老师要求用 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; }