习题3-2 分子量
UVa1585
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
const char s0[5] = "CHON";
const double num[4] = {12.01, 1.008, 16.00, 14.01};
void f(const char *s){
int n = strlen(s);
double sum = 0; //sum用于储存分子量
double t = 0; //t用于储存原子量
int tag; //tag标记是字母还是数字
int i = 0;
while(s[i]!='\0'){
t = 0;
if(isalpha(s[i])){ //isalpha判断是否为字母,只涉及字母与数字,字母为1,数字为0
tag = 1;
if(s[i]=='C') t = num[0];
else if(s[i]=='H') t = num[1];
else if(s[i]=='O') t = num[2];
else if(s[i]=='N') t = num[3];
sum += t; //先将一个原子量大小加到sum中,如果后续没有数字,则无需变动
} // 若后续有数字n,则加完n个后再减去一个原子量,避免重复加
else tag = 0;
i++;
int x = i;
if(x == n) break;
double nums = 0; //nums用于累加某个元素的总原子量,相隔元素分别计算
do{
if(isalpha(s[i])) tag = 1;
else {
tag = 0;
i++;
}
}while(!tag && i<n);
for(int j = x; j < i; j++){
nums += (s[j]-'0')*pow(10,i-j-1)*t;
}
if(nums) sum += nums - t;
}
printf("%.3f\n", sum);
}
int main(){
int T;
scanf("%d", &T);
while(T--){
char s[100];
scanf("%s", s);
f(s);
}
return 0;
}