- 题目链接
- 思路
(1) CHON的原子量存储:
对应的ASCALL码:
C --- 67 H --- 72 O ---- 79 N --- 78
所以利用数组存储 : a[0] = C a[5] = H .....
PS: 此处亦可使用函数的方式, 传入的参数是字符, 返回该字符对应的原子量
(2) 原子量的计算
从左至右依次读取字符, c1存储上一个字符, c2存储当前字符, c3存储上一个字母
分四种情况讨论:
- 上一个字符是数字,当前字符是数字
- 上一个字符是字母,当前字符是数字
- 上一个字符是数字,当前字符是字母
- 上一个字符是字母,当前字符是字母
(3) 代码
#include <iostream>
#include <ctype.h>
using namespace std;
int main(int argc, char *argv[])
{
int n,t; //n是样本个数
double a[15]={0},value; //value为最后的输出值
a[0] = 12.01; //C
a[5] = 1.008; //H
a[12] = 16.00; //O
a[11] = 14.01; //N
cin>>n;
getchar();
int c1,c2,c3; //c1是上一个字符, c2是当前字符, c3是上一个字母(CHON)
while(n--)
{
c3 = c1 = getchar();
value = 0;
t = 0;
while((c2 = getchar()) != '\n')
{
if(isdigit(char(c1)) && isdigit(char(c2))) //上一个字符是数字,当前字符是数字
{
t = t*10 + (char(c2) - '0');
}
else if(!isdigit(char(c1)) && isdigit(char(c2))) //上一个字符是字母,当前字符是数字
{
t = char(c2) - '0';
}
else if(isdigit(char(c1)) && !isdigit(char(c2))) //上一个字符是数字,当前字符是字母
{
value += t*a[c3-67];
c3 = c2;
}
else if(!isdigit(char(c1)) && !isdigit(char(c2))) //上一个字符是字母,当前字符是字母
{
value += a[c3-67];
c3 = c2;
}
c1 = c2;
}
if(isdigit(c1))
{
value += t*a[c3-67];
}else
{
value += a[c3-67];
}
printf("%.3f\n",value);
}
return 0;
}