<p>Given a string <code>expression</code> representing an expression of fraction addition and subtraction, return the calculation result in string format.</p>

<p>The final result should be an <a href="https://en.wikipedia.org/wiki/Irreducible_fraction" target="_blank">irreducible fraction</a>. If your final result is an integer, change it to the format of a fraction that has a denominator <code>1</code>. So in this case, <code>2</code> should be converted to <code>2/1</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> expression = &quot;-1/2+1/2&quot;
<strong>Output:</strong> &quot;0/1&quot;
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> expression = &quot;-1/2+1/2+1/3&quot;
<strong>Output:</strong> &quot;1/3&quot;
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> expression = &quot;1/3-1/2&quot;
<strong>Output:</strong> &quot;-1/6&quot;
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li>The input string only contains <code>&#39;0&#39;</code> to <code>&#39;9&#39;</code>, <code>&#39;/&#39;</code>, <code>&#39;+&#39;</code> and <code>&#39;-&#39;</code>. So does the output.</li>
	<li>Each fraction (input and output) has the format <code>&plusmn;numerator/denominator</code>. If the first input fraction or the output is positive, then <code>&#39;+&#39;</code> will be omitted.</li>
	<li>The input only contains valid <strong>irreducible fractions</strong>, where the <strong>numerator</strong> and <strong>denominator</strong> of each fraction will always be in the range <code>[1, 10]</code>. If the denominator is <code>1</code>, it means this fraction is actually an integer in a fraction format defined above.</li>
	<li>The number of given fractions will be in the range <code>[1, 10]</code>.</li>
	<li>The numerator and denominator of the <strong>final result</strong> are guaranteed to be valid and in the range of <strong>32-bit</strong> int.</li>
</ul>

class Solution {
public:
    string fractionAddition(string expression) {
        vector<tuple<long long, long long, long long>> v;
        if(expression[0] != '-')
            expression = "+" + expression;
        
        int len = expression.length();
        for(int i = 0; i < len; ++i)
        {
            long long sign;
            if(expression[i] == '+')
                sign = 1;
            else
                sign = -1;
            
            ++i;
            string num = "";
            while(i < len && expression[i] != '/')
                num += expression[i++];
            
            ++i;
            string den = "";
            while(i < len && expression[i] != '+' && expression[i] != '-')
                den += expression[i++];

            cout << sign << " " << num << " " << den << endl;
            
            v.push_back({ sign, stoll(num), stoll(den)});
            --i;
        }

        long long den = 1LL;
        for(auto &[ x, y, z ] : v)
            den = lcm(den, z);
        
        long long num = 0;
        for(auto &[ x, y, z ] : v)
            num += (x * y * den / z);

        cout << num << " " << den << endl;
        
        if(num == 0)
            den = 1LL;
        else
        {
            long long sign = (num < 0) ? -1 : 1; 
            num = abs(num);
            long long gcd = __gcd(num, den);
            num /= gcd;
            den /= gcd;

            num *= sign;
        }
        
        return to_string(num) + "/" + to_string(den);
    }
};
8200