UVA 1586 分子量

     一道有关字符串处理i的题目,很普通,只要注意下一个元素后面的数字的统计就行了,因为题目数  2<N<99 所以只要判断出来他是一位数还是两位数就行了,

切记flag标记,一开始掉了flag==1的判断,调了10分钟,QAQ




这个是我一开始的错误代码,,还没出来~

 # include<cstdio>
# include<iostream>
# include<cstring>

using namespace std;

# define MAX 100

char s[MAX];

int main(void)
{
    int t;
    cin>>t;
    while ( t-- )
    {
        int k1 = 0;
        int k2 = 0;
        int k3 = 0;
        int k4 = 0;
       scanf("%s",s);
       int n = strlen(s);
       double sum = 0;
       for ( int i = 0;i < n;i++ )
       {
           if ( s[i] == 'C' )
                {
                    if ( (s[i+1]<='9'&&s[i+1]>='1') )
                        {
                            if (s[i+2]<='9'&&s[i+2]>='1')
                                {
                                    k1 = s[i+1]*10+s[i+2];
                                }
                                else
                                k1 = s[i+1];
                        }
                        else
                        k1 = 1;
                }

           if ( s[i] == 'H' )
           {
                if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]<='9'&&s[i+2]>='1') )
                        {
                            k2 = s[i+1]*10+s[i+2];
                        }
                        else if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]=='C'||s[i+2]=='O'
                                    ||s[i+2]=='N') )
                        {
                            k2 = s[i+1];
                        }
                        else
                        k2 = 1;
           }
           if ( s[i] == 'O' )
           {
                if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]<='9'&&s[i+2]>='2') )
                        {
                            k3 = s[i+1]*10+s[i+2];
                        }
                        else if ( (s[i+1]<='9'&&s[i+1]>='1')&&(s[i+2]=='H'||s[i+2]=='C'
                                    ||s[i+2]=='N') )
                        {
                            k3 = s[i+1];
                        }
                        else
                        k3 = 1;
           }
           if ( s[i] == 'N' )
           {
                if ( s[i+1]<='9'&&s[i+1]>='1'&&s[i+2]<='9'&&s[i+2]>='1' )
                        {
                            k4 = s[i+1]*10+s[i+2];
                        }
                        else if ( s[i+1]<='9'&&s[i+1]>='1'&&(s[i+2]=='H'||s[i+2]=='O'
                                    ||s[i+2]=='C') )
                        {
                            k4 = s[i+1];
                        }
                        else
                        k4 = 1;
           }

       }
       cout<<k1<<endl;
       cout<<k2<<endl;
       cout<<k3<<endl;
       cout<<k4<<endl;

       sum = k1*12.01+k2*1.008+k3*16.00+k4*14.01;

       printf("%.3lfg/mol\n",sum);

    }



    return 0;
}





重新打的:

# include<cstdio>
# include<iostream>
# include<cstring>


using namespace std;

# define MAX 100

char s[MAX+10];
double a[MAX+10];

int g ( int x,int y )
{
    int t;
    for ( int i = x;i < y;i++ )
        {
            if ( s[i] <= '9'&&s[i] >= '0' )
                t = i;
            else
                break;


        }
        int sum = 0;
        for ( int i = x;i <= t;i++ )
        {
            sum = sum*10+( s[i] - '0' );
        }
        return sum-1;
}


int main(void)
{
    int t;cin>>t;
    while ( t-- )
    {
        scanf("%s",s);
        int len = strlen(s);
        int flag = 0;
        for ( int i = 0;i < len;i++ )
        {
            if ( s[i] == 'C' )a[i] = 12.01;
            if ( s[i] == 'H' )a[i] = 1.008;
            if ( s[i] == 'O' )a[i] = 16.00;
            if ( s[i] == 'N' )a[i] = 14.01;
            if ( s[i] >= '1' && s[i] <= '9'&&flag == 0 )
            {//flag = 0一定要切记!,调了10分钟 QAQ
                flag = 1;
                a[i] = a[i-1]*g(i,len);
            }
            if ( !( s[i] >= '0'&&s[i] <= '9') )flag = 0;
        }
     double sum1 = 0;

    for ( int i = 0;i < len;i++ )
    {
        //cout<<a[i]<<endl;
        sum1+=a[i];
    }
    printf("%.3lf\n",sum1);

    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值