UVa 1586 Molar mass

这一道化学方程式,我的思路是这个式子分为3种,一种是类似于C(什么数字都没有),第二种是类似于C6H5OH(只有一位数),第三种是类似于C12H22O11(有两位数字的)。

于是我先从最后开始判断,看这个是否是'C'||'H'||'N'||'O',是的话直接计数,不是的话字母那他就是数字,然后在此基础上判断前一个数是数字还是字母即可。这里要注意两点:(1.)当他是第二种或者第三种情况的话,那么i的值要注意【for(int i=strlen(i)-1;i>=0;i--) i是要变化的,如果是第二种那么i=i-1,如果是第三种那么i=i-2,这里不懂的话可以根据我的代码来理解】

(2)c12的意思是有12个c,那么这里不是直接c1+=12*c1; 要c1+=12*c1-'0';


ok了分析完毕,附上代码:

#include
#include
int main()
{
    int n,i;
    double sum;
    char s[101];
    scanf("%d",&n);
    while(n--)
    {
        int C1=0,H1=0,O1=0,N1=0;
        scanf("%s",&s);
        sum=0;
        for(i=strlen(s)-1; i>=0; i--)
        {
            if(s[i]=='C')
            {
                C1++;
                continue;
            }
            if(s[i]=='H')
            {
                H1++;
                continue;
            }
            if(s[i]=='O')
            {
                O1++;
                continue;
            }
            if(s[i]=='N')
            {
                N1++;
                continue;
            }
            if(s[i]>='1'&&s[i]<='9')
            {
                if(s[i-1]=='C')
                {
                    C1+=s[i]-'0';
                    i=i-1;
                    continue;
                }
                if(s[i-1]=='H')
                {
                    H1+=s[i]-'0';
                    i=i-1;
                    continue;
                }
                if(s[i-1]=='O')
                {
                    O1+=s[i]-'0';
                    i=i-1;
                    continue;
                }
                if(s[i-1]=='N')
                {
                    N1+=s[i]-'0';
                    i=i-1;
                    continue;
                }
                if(s[i-1]>='1'&&s[i-1]<='9')
                {
                    if(s[i-2]=='C')
                    {
                        C1+=(s[i-1]-'0')*10+s[i]-'0';
                        i=i-2;
                        continue;
                    }
                    if(s[i-2]=='H')
                    {
                        H1+=(s[i-1]-'0')*10+s[i]-'0';
                        i=i-2;
                        continue;
                    }
                    if(s[i-2]=='O')
                    {
                        O1+=(s[i-1]-'0')*10+s[i]-'0';
                        i=i-2;
                        continue;
                    }
                    if(s[i-2]=='N')
                    {
                        N1+=(s[i-1]-'0')*10+s[i]-'0';
                        i=i-2;
                        continue;
                    }
                }
            }

        }
        sum=C1*12.01+H1*1.008+O1*16.00+14.01*N1;
        printf("%.3lf\n",sum);
    }
    return 0;
}

这个代码有点长哈,我之后去借鉴一下别人的代码然后再来修改一下。

来了来了,这个代码真的很短啊,而且比我的简明的多:

#include
#include
double cost[]={0,0,12.01,0,0,0,0,1.008,0,0,0,0,0,14.01,
16.00,0,0,0,0,0,0,0,0,0,0,0};
int main()
{
    int n;
    char x[100];
    scanf("%d",&n);
    while(n--)
    {
        int n,lastx;
        double sum=0;
        scanf("%s",x);
        for(int i=0;x[i]!='\0';i++)
        {
            if(isalpha(x[i]))//这个函数get到了
            {
                lastx=x[i]-'A';//这样的话就不用判断他是四个中的哪一个,粗暴简单,棒
                sum=sum+cost[lastx];
            }
            else
            {
              n=x[i]-'0';
              if(x[i+1]>='0'&&x[i+1]<='9')
              {
                  n=n*10+x[i+1]-'0';
                  i++;
              }
              sum=sum+(n-1)*cost[lastx];
            }
        }
        printf("%.3f\n",sum);
    }
    return 0;
}


你可能感兴趣的:(UVa 1586 Molar mass)