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 }
复制代码

 

下面是另一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#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 @   爱喝可乐的咖啡  阅读(542)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示