时间限制 | 内存限制 |
---|---|
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; | |
} |