给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。
示例 1:
输入:"-1/2+1/2"输出: "0/1"
示例 2:
输入:"-1/2+1/2+1/3"
输出: "1/3"
示例 3:
输入:"1/3-1/2"
输出: "-1/6"
示例 4:
输入:"5/3+1/3"
输出: "2/1"
说明:
- 输入和输出字符串只包含 
'0'到'9'的数字,以及'/','+'和'-'。 - 输入和输出分数格式均为 
±分子/分母。如果输入的第一个分数或者输出的分数是正数,则'+'会被省略掉。 - 输入只包含合法的最简分数,每个分数的分子与分母的范围是 [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
 - 输入的分数个数范围是 [1,10]。
 - 最终结果的分子与分母保证是 32 位整数范围内的有效整数。
 
class Solution {
public:
    string fractionAddition(string expression) {
        int a_x, a_y;
        int r_x, r_y;
        a_x = 0;
        a_y = 1;
        r_x = 0;
        r_y = 1;
        int right = 0;
        int flag = true;
        if(expression.size() == 0){
            return "0/1";
        }
        while(right <= expression.size()){
            int left = right;
            while(right <= expression.size() && expression[right] != '-' && expression[right] != '+' && expression[right] != '/'){
                right++;
            }
            if(right >= expression.size()){
                if(right - left > 0)
                    a_y = stoi(expression.substr(left , expression.size() - left));
                r_x = a_x * r_y + a_y * r_x; 
                r_y = a_y * r_y;
                // cout<<"s: "<<r_x<<" "<<r_y<<endl;
                break;
            }
            if(expression[right] == '-'){
                flag = false;
                if(right - left > 0)
                    a_y = stoi(expression.substr(left , right - left));
                r_x = a_x * r_y + a_y * r_x; 
                r_y = a_y * r_y;
            }else if(expression[right] == '+'){
                flag = true;
                if(right - left > 0)
                    a_y = stoi(expression.substr(left, right - left));
                r_x = a_x * r_y + a_y * r_x; 
                r_y = a_y * r_y;
            }else if(expression[right] == '/'){
                a_x = stoi(expression.substr(left, right - left));
                if(flag == false){
                    a_x = -a_x;
                }
            }
            right++;
        }
        for(int j = max(abs(r_x), abs(r_y)); j >0; j--){
            if(r_x % j == 0 && r_y % j == 0){
                r_x = r_x / j;
                r_y = r_y / j;
            }
        }
        return to_string(r_x) + "/" + to_string(r_y);
    }
};
                    