UVaoj 1586处理输入的一个小问题

题目大意:输入一个分子式,计算分子质量,分子式长度不超过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);
	}
}
修改之后就可以通过

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值