时间限制:1000MS  内存限制:1000K
提交次数:218 通过次数:89
题型: 编程题 语言: G++;GCC
给出一个化学原子式,仅含有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;
}
原文:http://www.cnblogs.com/geek1116/p/5222452.html