8626 原子量计数

8626 原子量计数

时间限制:1000MS  内存限制:1000K
提交次数:218 通过次数:89

题型: 编程题   语言: G++;GCC

 

Description

给出一个化学原子式,仅含有C,H,O,N 四种元素,计算其总分子量。
例如,C6H5OH 的原子量为94.108g/mol,计算方法为:
6 × (12.01 g/mol) + 6 × (1.008 g/mol) +1 × (16.00 g/mol).




输入格式

输入的第一行是数字T,表示输入文件含有T个CASE。之后有T行,每行有一个长度小于100 的字符串,
表示要求的分子式。原子都用大写字母表示,没有括号,保证所有的式子都合法。



输出格式

输出每个式子的原子量。



 

输入样例

4
C
C6H5OH
NH2CH2COOH
C12H22O11



 

输出样例

12.010
94.108
75.070
342.296



 

提示




 

来源

 PKKJ @ 07 GIS 1 

 

作者

 admin

 

  很简单的一道模拟题,代码不是很长,测试数据也并不坑人;直接上代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <math.h>
  5 
  6 //using namespace std;
  7 
  8 int main()
  9 {
 10     int T;
 11     char s[200];
 12     int i,j,k,c,o,h,n;
 13     scanf("%d\n",&T);
 14     for(i=0; i<T; i++)
 15     {
 16         c=0;
 17         h=0;
 18         n=0;
 19         o=0;
 20         k=0;
 21         scanf("%s",s);
 22         int len=strlen(s);
 23         for(j=0; j<len; j++)
 24         {
 25             if(s[j]=='C')
 26             {
 27                 k=j+1; int temp=0;
 28                 if(s[k]>='0'&&s[k]<='9')
 29                     while(s[k]>='0'&&s[k]<='9')
 30                     {
 31                         if(k>j+1)
 32                             temp=temp*10+s[k]-'0';
 33                         else
 34                             temp+=s[k]-'0';
 35                         k++;
 36                     }
 37                 else
 38                     temp++;
 39                 c+=temp;
 40             }
 41 
 42             else if(s[j]=='O')
 43             {
 44                 k=j+1; int temp=0;
 45                 if(s[k]>='0'&&s[k]<='9')
 46                     while(s[k]>='0'&&s[k]<='9')
 47                     {
 48                         if(k>j+1)
 49                             temp=temp*10+s[k]-'0';
 50                         else
 51                             temp+=s[k]-'0';
 52                         k++;
 53                     }
 54                 else
 55                     temp++;
 56                 o+=temp;
 57 
 58             }
 59             else if(s[j]=='H')
 60             {
 61                 k=j+1;int temp=0;
 62                 if(s[k]>='0'&&s[k]<='9')
 63                     while(s[k]>='0'&&s[k]<='9')
 64                     {
 65                         if(k>j+1)
 66                             temp=temp*10+s[k]-'0';
 67                         else
 68                             temp+=s[k]-'0';
 69                         k++;
 70                     }
 71                 else
 72                     temp++;
 73                 h+=temp;
 74 
 75 
 76             }
 77             else if(s[j]=='N')
 78             {
 79                 k=j+1;int temp=0;
 80                 if(s[k]>='0'&&s[k]<='9')
 81                     while(s[k]>='0'&&s[k]<='9')
 82                     {
 83                         if(k>j+1)
 84                             temp=temp*10+s[k]-'0';
 85                         else
 86                             temp+=s[k]-'0';
 87                         k++;
 88                     }
 89                 else
 90                     temp++;
 91                 n+=temp;
 92 
 93 
 94             }
 95         }
 96         double sum_c=12.010,sum_h=1.008,sum_o=16.000,sum_n=14.010;
 97         double ans=c*sum_c+h*sum_h+o*sum_o+n*sum_n;
 98         printf("%.3lf\n",ans);
 99     }
100     return 0;
101 }

 

下面是另一种方法:

#include <stdio.h>
#include <string.h>
int check(int temp[],int n);
int digit(char a);
int main()
{
    int T;
    scanf("%d",&T);
    const double w_h=1.008,w_n=14.01,w_o=16.00,w_c=12.01;
    while(T--)
    {
        char a[105];
        int i,j,num_h=0,num_n=0,num_o=0,num_c=0;
        double sum=0;
        scanf("%s",a);
        int alen=strlen(a);
        //
        {
            int temp[20];
            for(i=0;i<alen;i++)
            {
                if(a[i]=='H')
                {
                    int n=0;
                    for(j=i+1;digit(a[j]);j++)
                    {
                        temp[n++]=a[j]-'0';
                    }
                    if(n==0)
                    {
                        n=1;
                        num_h+=n;
                    }
                    else
                    {
                        num_h+=check(temp,n);
                    }
                }
            }
        }
        {
            int temp[20];
            for(i=0;i<alen;i++)
            {
                if(a[i]=='N')
                {
                    int n=0;
                    for(j=i+1;digit(a[j]);j++)
                    {
                        temp[n++]=a[j]-'0';
                    }
                    if(n==0)
                    {
                        n=1;
                        num_n+=n;
                    }
                    else
                    {
                        num_n+=check(temp,n);
                    }
                }
            }
        }
        {
            int temp[20];
            for(i=0;i<alen;i++)
            {
                if(a[i]=='O')
                {
                    int n=0;
                    for(j=i+1;digit(a[j]);j++)
                    {
                        temp[n++]=a[j]-'0';
                    }
                    if(n==0)
                    {
                        n=1;
                        num_o+=n;
                    }
                    else
                    {
                        num_o+=check(temp,n);
                    }
                }
            }
        }
        {
            int temp[20];
            for(i=0;i<alen;i++)
            {
                if(a[i]=='C')
                {
                    int n=0;
                    for(j=i+1;digit(a[j]);j++)
                    {
                        temp[n++]=a[j]-'0';
                    }
                    if(n==0)
                    {
                        n=1;
                        num_c+=n;
                    }
                    else
                    {
                        num_c+=check(temp,n);
                    }
                }
            }
        }
        sum=num_h*w_h+num_c*w_c+num_n*w_n+num_o*w_o;
        printf("%.3lf\n",sum);

    }
    return 0;
}
int check(int temp[],int n)
{
    int i,sum=0,m=1;
    for(i=n-1;i>=0;i--)
    {
        sum+=temp[i]*m;
        m*=10;
    }
    return sum;
}
int digit(char a)
{
    if(a<='9'&&a>='0')
        return 1;
    else return 0;
}

  

posted @ 2016-02-27 10:46  爱喝可乐的咖啡  阅读(536)  评论(0编辑  收藏  举报