UVa1586 分子量
题目描述:根据分子式来计算其摩尔质量
思路:
字母后面的数字表示了它的系数,读入整个字符串,因此需要判断每个字符是字母还是数字。
题意很明确,就是根据这个分子式来计算摩尔质量,需要注意的地方是:
1.若一个字母后面跟着的是字母或者该字母后面没有更多的字符,那么其系数为1,直接加上就OK
2. 如果字母后面是数字,那么就一直读取这个数字的各个位数,然后将这个字符表示的数转换为十进制的数,即为当前字母的系数,乘上单个分子质量后加在总的上就行。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 float CharToWeight(char ch) 5 { 6 float Weight; 7 switch(ch){ 8 case 'C': 9 Weight = 12.01; 10 break; 11 case 'N': 12 Weight = 14.01; 13 break; 14 case 'O': 15 Weight = 16.00; 16 break; 17 case 'H': 18 Weight = 1.008; 19 break; 20 } 21 return Weight; 22 } 23 24 int StringToNum(char s[]) 25 { 26 int num = 0, xishu = 1; 27 for(int i = strlen(s) - 1; i >= 0; --i){ 28 //printf("%c\n", s[i]); 29 num += (s[i]-'0') * xishu; 30 xishu *= 10; 31 } 32 return num; 33 } 34 35 int main() 36 { 37 int n; 38 char s[100]; 39 scanf("%d", &n); 40 while(n > 0){ 41 scanf("%s", s); 42 float tmpWeight = 0.0, Weight = 0.0; 43 int xishu = 1, i = 1, j, k; 44 char num[100]; 45 for(i = 0; i < strlen(s); ++i){ 46 if(i + 1 == strlen(s) || isalpha(s[i+1])){ //如果后面是字母或者到达最后 47 Weight += CharToWeight(s[i]); 48 }else{ //如果后面是数字 49 for(k = 0, j = i+1; j < strlen(s) && isdigit(s[j]); ++j,++k){ //把连续的数字都找出来 50 num[k] = s[j]; 51 // printf("%c\n", num[k]); 52 } 53 num[k] = '\0'; 54 xishu = StringToNum(num); 55 Weight += CharToWeight(s[i]) * xishu; 56 i = j-1; 57 } 58 } 59 printf("%.3f\n", Weight); 60 --n; 61 } 62 }