Molar Mass

Molar Mass

附上翻译:

现给你若干个分子式需要你求分子量。

例如: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; }

 

上一篇:第四周课程总结&试验报告(二)


下一篇:java第七次作业