zoj2351

题目大意:

公式: pH = -log10 [H+] PH值根据氢离子浓度求出 ,【这里的 [H+] 浓度是摩尔每升为单位的】

Ka = [H+] [acid ions] / [acid] 平衡常数K等于分解的氢离子和酸根离子乘积与未分解的酸分子的比值

输入格式: Ka :常数 ori :初始酸浓度 m :1摩酸分子完全溶解 分解出氢离子数 n :1摩酸分子完全溶解 分解出氢离子数【注意是完全溶解】
【这题需要特别注意的是】指数形式是可以直接输入的。如用scanf 或者 printf要用%e输入。

解题思路:

题目给出了一个比较好的例子,用了甲酸的例子:甲酸的平衡常数Ka是1.6 * 10-4,1摩尔甲酸完全溶解放出1摩尔 [H+] 和1摩尔酸根离子,如果初始浓度是0.1 moles/L,但是不知道确切有多少甲酸溶解了,设为x摩尔/L,最后平衡的时候,就有0.1 - x moles/L的甲酸分子(未溶解),[H+] 和酸根离子各 x moles/L。

注意:我上面一直强调的两个不同的概念,完全溶解和不完全溶解,完全溶解就是每个酸分子都水解成 [H+] 和酸根离子了,不完全溶解就是一个动态平衡的过程。我记得高中化学里面讲到的,其实不存在完全水解的酸,就算是强电解质。。。回到题目上来,题目给出的m和n都是完全电解环境下,这样就相当于给出了一个酸分子分解后的 [H+] 和酸根离子比例。比如m=2,n=1,就是2个 [H+] 和1个酸根离子,比如硫酸H2SO4。。。

这样就可以设未知数列方程了,我们假设每L溶解了x摩尔的该酸,就有
Ka = mx*nx / ori-x ,变换以后就是 Ka*(ori-x) = mn*x*x ,再就是 mnx^2 + Ka*x - Ka*ori = 0,这样就变成了一个一元二次方程,就可以开始解方程了。
x = [sqrt(Ka*Ka+4*m*n*Ka*ori)-Ka] / 2mn,这里还没完,因为我们只是得到了每L溶解了x摩尔的该酸,还不是最后要求出的 [H+] ,所以还得乘上一个m。

消去分母里面的m,这样才变成了大家博客里面津津乐道的:
[cpp] view plain copy
i=-log10((sqrt(k*k+4*a*m*n*k)-k)/2/n);
printf(“%.3f\n”,i);

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
  int m,n,N;
  double a,b,ph;
  scanf("%d",&N);
  while(N--)
  {
    while(scanf("%le%le%d%d",&a,&b,&m,&n)!=EOF)
    {
      if(m==0&&n==0&&a==0&&b==0)
        break;
      ph=-log10((sqrt(a*a+4*a*b*m*n)-a)/2/n);
      printf("%.3f\n",ph);
    }
    if(N)
     printf("\n");
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值