uva1586分子量(Molar Mass,ACM/ICPC Danang 2007)

#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int main() {
    int t;
    cin >> t;
    while (t--) {
        double C = 12.01, H = 1.008, O = 16.00, N = 14.01;
        double z;
        int w;
        double sum = 0.0;
        char x[100];
        cin >> x;
        for (int i = 0; x[i]; i++) {
            if (x[i] == 'C') {
                z = C;
            }
            else if (x[i] == 'H') {
                z = H;
            }
            else if (x[i] == 'O')
            {
                z = O;
            }

            else if (x[i] == 'N') {
                z = N;
            }

            if ((x[i + 1] - '0') > =1 && (x[i + 1] - '0' <= 9)) {
                w = x[i + 1] - '0';
                i++;
                if ((x[i + 1] - '0') >= 1 && (x[i + 1] - '0') <= 9) {
                    w = w * 10 + (x[i + 1] - '0');
                    i++;
                }
            }
            else { w = 1; }
            sum += w * z;
}
        cout << fixed << setprecision(3) << sum << endl;
    }
        return 0;
}

也是改了小两天,然后说一下核心代码逻辑两大块的核心

第一个是有四个字母然后把for循环中匹配到的字母进行确认到z里面后面进行

第一大逻辑

第二的大逻辑就行下面的if那个三大判断条件第一个是一位数并且是大于1的小于10的

x然后是大于10的就是二位数

第三个就是没有数字的就是1的

然后代码具体要考虑i++每次进行i++自动i++这样避免算完字母后碰到数字然后会多算一次字母。就是一位算数字后i++如果【i+2】就是匹配到两位数的话再次i++;这样可以有效避免数字越界(你可以好好思考一下)如果都没有就是1直接定义1即可。好了没了感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值