附上翻译:
现给你若干个分子式需要你求分子量。
例如:C6H5OH的分子量为12.016+1.0085+16.00+1.008=94.108g/mol。
个人解法:我认为这道题的难点在于如何算出一个字母后的数字大小,我的做法是不断判断字符是否大于0小于10,直到到达一个字母,在这个过程中不断累加原子数量
代码如下:
#include<stdio.h> #include<string.h> #define C 12.01 #define H 1.008 #define O 16.00 #define N 14.01 int main(void) { int n; scanf("%d", &n); while (n--) { char ch[999]; scanf("%s", ch); int m = strlen(ch); double sum = 0; for (int i = 0; i < m; i++) { int q = 0;//用来记录字母后面是否有数字,如果有数字q就会变为1 double count = 0; int rec = i+1;
//while这个地方是可以用!isalpha(ch[rec])&&ch[rec]!=0代替掉的,如果不是字母那么就往后迭代,直到遇到字母或者字符串末尾
while (ch[rec] - '0' > 0 && ch[rec] - '0' < 10) // 一直找字母后是数字的字符 { q = 1; count = count*10+ch[rec]-'0';//将每次找到的字符转换为数字加起来,注意每迭代一次,就需要将原来的count*10再加上新的数字 rec++; } if (q) { switch (ch[i]) { case 'C':sum += C * count; break; case 'H':sum += H * count; break; case 'O':sum += O * count; break; case 'N':sum += N * count; break; } i = rec-1;//因为中间都为数字所以不用考虑中间数字,直接将i移动到最后一个数字后的字母上,因为rec已经在字母的位置,每次迭代i会加1,所以这个地方i = rec-1 } else { switch (ch[i]) { case 'C':sum += C; break; case 'H':sum += H; break; case 'O':sum += O; break; case 'N':sum += N; break; } } } printf("%.3lf\n", sum); } return 0; }