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 }

 

posted @ 2019-07-11 16:26  patrolli  阅读(206)  评论(0编辑  收藏  举报