Easy to Understand and Use Simple Logic  beat 100% Complexity
Intuition\n Describe your first thoughts on how to solve this problem. \nGetting Data From the String into a Vector array of Structure and Then Calculate Result
# Intuition\n<!-- Describe your first thoughts on how to solve this problem. -->\nGetting Data From the String into a Vector array of Structure and Then Calculate Results and Convert again into the string.  \n\n# Approach\n<!-- Describe your approach to solving the problem. -->\nSimple Math and String Manupulation.\n\n# Complexity\n- Time complexity:\n<!-- Add your time complexity here, e.g. $$O(n)$$ -->\n\u201CO(n+flog(m))\u201D\n\n- Space complexity:\n<!-- Add your space complexity here, e.g. $$O(n)$$ -->\nO(f)\n\n# Code\n```cpp []\n\nclass Solution {\npublic:\n    struct Fract {\n        int sign;\n        int Nom;\n        int Denom;\n    };\n\n    void getdata(vector<Fract>& arr, const string& data) {\n        size_t i = 0;\n        while (i < data.size()) {\n            Fract Temp;\n            // Handle sign\n            if (data[i] == \'-\') {\n                Temp.sign = -1;\n                i++;\n            } else {\n                Temp.sign = 1;\n                if (data[i] == \'+\') {\n                    i++;\n                }\n            }\n\n            // Extract numerator\n            size_t start = i;\n            while (i < data.size() && data[i] != \'/\') {\n                if (!isdigit(data[i])) {\n                    throw invalid_argument("Invalid character in numerator");\n                }\n                i++;\n            }\n            Temp.Nom = stoi(data.substr(start, i - start));\n            i++; // Skip \'/\'\n\n            // Extract denominator\n            start = i;\n            while (i < data.size() && isdigit(data[i])) {\n                i++;\n            }\n            if (i > start) {\n                Temp.Denom = stoi(data.substr(start, i - start));\n            } else {\n                throw invalid_argument("Invalid character in denominator");\n            }\n\n            arr.push_back(Temp);\n        }\n    }\n\n    Fract helper(const Fract& num1, const Fract& num2) {\n        Fract ans;\n        int LCM = num1.Denom * num2.Denom / findGCD(num1.Denom, num2.Denom);\n        ans.Denom = LCM;\n        ans.Nom = num1.sign * num1.Nom * (LCM / num1.Denom) + num2.sign * num2.Nom * (LCM / num2.Denom);\n        ans.sign = (ans.Nom < 0) ? -1 : 1;\n        ans.Nom = abs(ans.Nom);\n        \n        int gcd = findGCD(ans.Nom, ans.Denom);\n        ans.Nom /= gcd;\n        ans.Denom /= gcd;\n\n        return ans;\n    }\n\n    Fract ComputeFinal(vector<Fract>& array) {\n        Fract result = array[0];\n        for (size_t i = 1; i < array.size(); ++i) {\n            result = helper(result, array[i]);\n        }\n        return result;\n    }\n\n    int findGCD(int a, int b) {\n        while (b != 0) {\n            int temp = b;\n            b = a % b;\n            a = temp;\n        }\n        return a;\n    }\n\n    string fractionAddition(const string& expression) {\n        vector<Fract> Data;\n        try {\n            getdata(Data, expression);\n        } catch (const invalid_argument& e) {\n            cerr << "Error: " << e.what() << endl;\n            return "";\n        }\n        \n        Fract Final_ans = ComputeFinal(Data);\n        \n        ostringstream oss;\n        if (Final_ans.sign == -1) {\n            oss << \'-\';\n        }\n        oss << Final_ans.Nom << \'/\' << Final_ans.Denom;\n        return oss.str();\n    }\n};\n```
['Math', 'String', 'Simulation', 'C++', 'Java', 'Python3']