时间限制 内存限制
1000 ms 65536 KB

# 题目描述

Paradise 非常喜欢化学,于是找来了一种神奇的化合物,并让你求出这种化合物的相对分子质量

不过善良的 Paradise 不忍心为难你,所以这种化合物中的元素有限,只有下表中的几种化合物

元素名称 元素符号 相对原子质量
H 11
C 1212
N 1414
O 1616
F 1919
P 3131
S 3232
I 127127

不过这种化合物的结构可能非常非常奇怪(比如样例)!所以不能保证真实世界一定存在!不过还是可以按照计算相对分子质量的方法算出来的!当然,如果你没有学过化学也不要紧,按照本题最后给出的方法也可以写出来的!

# 输入格式

一行字符串,化合物的结构式。

字符串中的字符只有元素符号和数字。

保证相对分子质量不超过 1000010000,每个元素符号后面不会是数字 00

# 输出格式

一个正整数,代表相对分子质量。

# 输入样例

H2SO3CH3CH2CH2CH2CH2CH2COOH

# 输出样例

212

# 样例解释

这种化合物每分子含有 1616 个氢原子、77 个碳原子、55 个氧原子、11 个硫原子,相对分子质量是 16×1+7×12+5×16+1×32=21216×1+7×12+5×16+1×32=212

# 提示

所有出现的元素符号都只有一个字符!而读入数字的时候,如果一开始就遇到了非数字字符,就会匹配失败,那么这个变量的值会不会发生变化呢?你可以尝试使用以下代码读入:

char r;
int n = 1;
while(scanf("%c%d", &r, &n) != EOF)
{
    //do something...
}

没有学过化学怎么办呀?不要担心,这里给出计算相对原子质量的方法:相对分子质量是每个原子的相对原子质量的和。在题目给出的化学式中,如果一个元素符号后面跟着一个正整数 nn,就表示这里有 nn 个这种原子;如果后面没有跟着数字,就说明这里只有一个这种原子。当然一个分子中可能不同位置都会有同一种原子的出现~

# 题解:模拟

提示给了我们一种很优美的写法,当 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;
}