习题3-2 分子量 UVa1586
感悟。
1、直接看英文原题的输入输出样例,在题意理解要求上省了许多力。
2、程序思路与习题3-1比较接近,但是调试花了很多时间,对于for循环中的i++有了更深的理解,下一次循环,i要自加1。
3、对将一个个数字拼成一个多位数的整数很有心得。
4、满心欢喜提交代码,WA,定睛一看输出多了g/mol,速改,之后AC。
附上代码
环境Dev-cpp4.9.9.2
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char s[1000+10];
float value(char c){//根据不同的原子,获取相应的原子量
float v;
switch(c){
case 'C':
v=12.01;
break;
case 'H':
v=1.008;
break;
case 'O':
v=16.00;
break;
case 'N':
v=14.01;
break;
}
return v;
}
int main(){
int T;
int len;
int i;
float sum;
int m;
int k;
scanf("%d",&T);
while(T--){
sum=0;
scanf("%s",s);
len=strlen(s);
for(i=0;i<len;i++){
if(isalpha(s[i])){
if(i+1<len){//获取相关原子个数
if(isdigit(s[i+1])){//下一个元素是数字
k=1;
m=0;
while(i+k<len&&isdigit(s[i+k])){//单个数字连接成一个多位数的数字
m*=10;
m+=s[i+k]-'0';
k++;
}
sum+=value(s[i])*m;
i=i+k-1;//重新开始,i要自加1,故先将i减1
}else{//下一个元素是字母
m=1;
sum+=value(s[i])*m;
}
}else{//下一个元素已越界
m=1;
sum+=value(s[i])*m;
}
}
}
printf("%.3f\n",sum);
}
return 0;
}