| 时间限制 | 内存限制 | 
|---|---|
1000 ms | 
65536 KB | 
# 题目描述
Paradise 非常喜欢化学,于是找来了一种神奇的化合物,并让你求出这种化合物的相对分子质量
不过善良的 Paradise 不忍心为难你,所以这种化合物中的元素有限,只有下表中的几种化合物
| 元素名称 | 元素符号 | 相对原子质量 | 
|---|---|---|
| 氢 | H | |
| 碳 | C | |
| 氮 | N | |
| 氧 | O | |
| 氟 | F | |
| 磷 | P | |
| 硫 | S | |
| 碘 | I | 
不过这种化合物的结构可能非常非常奇怪(比如样例)!所以不能保证真实世界一定存在!不过还是可以按照计算相对分子质量的方法算出来的!当然,如果你没有学过化学也不要紧,按照本题最后给出的方法也可以写出来的!
# 输入格式
一行字符串,化合物的结构式。
字符串中的字符只有元素符号和数字。
保证相对分子质量不超过 ,每个元素符号后面不会是数字 。
# 输出格式
一个正整数,代表相对分子质量。
# 输入样例
H2SO3CH3CH2CH2CH2CH2CH2COOH  | 
# 输出样例
212  | 
# 样例解释
这种化合物每分子含有 个氢原子、 个碳原子、 个氧原子、 个硫原子,相对分子质量是 。
# 提示
所有出现的元素符号都只有一个字符!而读入数字的时候,如果一开始就遇到了非数字字符,就会匹配失败,那么这个变量的值会不会发生变化呢?你可以尝试使用以下代码读入:
char r;  | |
int n = 1;  | |
while(scanf("%c%d", &r, &n) != EOF)  | |
{ | |
    //do something... | |
} | 
没有学过化学怎么办呀?不要担心,这里给出计算相对原子质量的方法:相对分子质量是每个原子的相对原子质量的和。在题目给出的化学式中,如果一个元素符号后面跟着一个正整数 ,就表示这里有 个这种原子;如果后面没有跟着数字,就说明这里只有一个这种原子。当然一个分子中可能不同位置都会有同一种原子的出现~
# 题解:模拟
提示给了我们一种很优美的写法,当  scanf  匹配失败之后,对应变量的值不会改变。所以我们直接用他的思路模拟题意即可。
参考代码:
#include <stdio.h> | |
int GetWeight(char c)  | |
{ | |
switch (c)  | |
    { | |
case 'H': return 1;  | |
case 'C': return 12;  | |
case 'N': return 14;  | |
case 'O': return 16;  | |
case 'F': return 19;  | |
case 'P': return 31;  | |
case 'S': return 32;  | |
case 'I': return 127;  | |
default: return 0;  | |
    } | |
return 0;  | |
} | |
int main()  | |
{ | |
    // freopen("R.in", "r", stdin); | |
    // freopen("R.out", "w", stdout); | |
char r;  | |
int n = 1, w = 0;  | |
while (~scanf("%c%d", &r, &n))  | |
    { | |
if (n)  | |
w += GetWeight(r) * n;  | |
        else | |
w += GetWeight(r);  | |
n = 0;  | |
    } | |
printf("%d\n", w);  | |
return 0;  | |
} |