592. 分数加减运算

原题链接:592. 分数加减运算

 

模拟:
 

class Solution {
public:
    //辗转相除法求最大公约数
    int gcd(int a, int b) {
        return b ? gcd(b, a % b) : a;
    }
    string fractionAddition(string expression) {
        int n = 0;
        for(auto &x :expression) {
            if(x == '/') n++;
        }
        expression = '+' + expression;
        int a = 0,b = 1,offset = 0;
        int c, d;
        char e;
        for (int i = 0; i < n; i ++ ) {
            sscanf(expression.c_str() + offset, "%c%d/%d", &e, &c, &d);
            offset += (e + to_string(c) + '/' + to_string(d)).size();
            if (e == '-') c = -c;
            int x = a * d + b * c, y = b * d;
            int z = gcd(x, y);
            a = x / z, b = y / z;
        }


        if(b < 0) b = -b, a = -a;
        return to_string(a) + '/' + to_string(b);
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值