题目大意:输入一个分子式,计算分子质量,分子式长度不超过80,每个分子后面的数字为2-99,若为1则省略;
题目比较简单,但是有一个处理输入的小问题。一开始我用的getchar()边读取边计算,但是提交之后是WA,代码如下
#include <cstdio>
int main(){
int n;
scanf("%d", &n);
getchar();
while (n--){
char ch;
int num = 0;
double mass=0;
double totle = 0;
while ((ch = getchar()) != '\n'){
if (ch > 'A'&&ch < 'Z') {
totle +=num>0?mass*num:mass;
mass = ch == 'C' ? 12.01 : ch == 'H' ? 1.008 : ch == 'O' ? 16.00 : 14.01;
num = 0;
}
else if(ch>='0'&&ch<='9'){
num *= 10;
num += ch - '0';
}
}
totle += num>0 ? mass*num : mass;
printf("%.3f\n", totle);
}
}
后来请教虎哥,虎哥说可能后台给的输入有干扰的空白符,比如输入数据为
4
C
C6H5OH
NH2CH2COOH
C12H22O11
即每一行后面不是直接加一个换行符,而是有若干个空白符之后加入一个换行符,这种情况如果用getchar()处理会非常麻烦,而且也不是这种问题考虑的重点,因此推荐用scanf("%s",&x)代替getchar();
scanf("%s",&x)可以跳过前面任意多个的空白符,开始读取数据之后,读到第一个空白符为止。这样就不需要考虑每行后面多余的空白符或者换行符了,在不是解决大数据规模的问题的情况下,使用scanf("%s",&x)比较方便。
修改之后的代码为
#include <cstdio>
int main(){
int n;
scanf("%d", &n);
getchar();
while (n--){
int num = 0;
double mass=0;
double totle = 0;
char str[100];
scanf("%s", str);
int i;
for (i = 0; str[i] != '\0';i++){
if (str[i] > 'A'&&str[i] < 'Z') {
totle +=num>0?mass*num:mass;
mass = str[i] == 'C' ? 12.01 : str[i] == 'H' ? 1.008 : str[i] == 'O' ? 16.00 : 14.01;
num = 0;
}
else if (str[i] >= '0'&&str[i] <= '9'){
num *= 10;
num += str[i] - '0';
}
}
totle += num>0 ? mass*num : mass;
printf("%.3f\n", totle);
}
}
修改之后就可以通过