HHUOJ_1351: 相对分子质量

来源:互联网 发布:求免费数据恢复软件 编辑:程序博客网 时间:2024/04/28 15:07

HHUOJ_1351: 相对分子质量

题目描述

小明最近迷上了化学,几乎天天在实验室做实验,但是很多实验生成的化学产物的相对分子质量令他很困惑,不知如何计算,请你编程帮他计算。

输入

输入的第一行是一个正整数n,表示有n组测试数据。
接下来n行每行输入一个字符串,表示某个分子式,分子式中只包含大写字母和数字。
注意:
输入数据只包含8种元素,而这8种元素的相对原子质量如下:
H(1),C(12),N(14),O(16),F(19),P(31),S(32),K(39)。

输出

对于每组输入,输出相对分子质量。

样例输入

4H2OKOHCH4SO2

样例输出

18561664

思路

记得之前在看算法竞赛入门那本书时看到过跟这个类似的题目,那个题比较简单,只有C、H、O、N四个元素,坑爹的是题目数据给的每个原子量都是个位数的情况,我记得第一次写时直接判断后面那一位是不是数字isdigit();(原谅我的蠢\笑哭),并没有考虑如果原子数是多位的情况,第二次才AC,有了上次的经验,这次直接AC!

代码

#include <iostream>#include <cstring>using namespace std;int main(){    int n;    cin>>n;    while(n--){        char s[110];        cin>>s;        int sum = 0;//总质量        int cnt = 0;//原子个数         int len = strlen(s);        for(int i=0; i<len; ){            cnt = 0;            if(s[i] == 'H'){                if(!isdigit(s[i+1])){                    sum += 1;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*1;                }            }else if(s[i] == 'C'){                if(!isdigit(s[i+1])){                    sum += 12;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*12;                }            }else if(s[i] == 'N'){                if(!isdigit(s[i+1])){                    sum += 14;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*14;                }            }else if(s[i] == 'O'){                if(!isdigit(s[i+1])){                    sum += 16;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*16;                }            }else if(s[i] == 'F'){                if(!isdigit(s[i+1])){                    sum += 19;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*19;                }            }else if(s[i] == 'P'){                if(!isdigit(s[i+1])){                    sum += 31;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*31;                }            }else if(s[i] == 'S'){                if(!isdigit(s[i+1])){                    sum += 32;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*32;                }            }else if(s[i] == 'K'){                if(!isdigit(s[i+1])){                    sum += 39;                    i++;                }else {                    while(isdigit(s[i+1])){                        cnt = cnt*10 + (s[i+1]-'0');                        i++;                    }                    i++;                    sum += cnt*39;                }            }        }        cout<<sum<<endl;    }    return 0;} 

虽然是AC了,但总觉得代码很冗余,希望大佬能给出更优解~

原创粉丝点击