LC-592 分数加减
主要问题:
输入一个分数加减的字符串,进行计算并输出分数
主要思路:
对字符串分割出每一个分数(包含符号),然后用两个vector来分别存分子和分母。
解析字符串后,对所有分母找他们的最小公倍数,然后对分子进行相应的加倍后加减,算出总和。
最后计算分子总和与分母最小公倍数的最大公约数,进行化简,输出答案。
代码:
1 class Solution { 2 public: 3 int gcd(int a, int b) { 4 if(b) while((a %= b) && (b %= a)); 5 return a + b; 6 } 7 8 int lcm(int a, int b){ 9 return (a * b) / gcd(a, b); 10 } 11 12 string fractionAddition(string expression) { 13 vector<int> numerator, denominator; 14 bool flag = false; 15 while (!expression.empty()) { 16 int index; 17 for (index = 0; index < expression.length(); index++) { 18 if (index != 0 && (expression[index] == '+' || expression[index] == '-')) { 19 break; 20 } 21 } 22 string fraction = expression.substr(0, index); 23 expression.erase(0, index); 24 int split = fraction.find('/'); 25 string num = fraction.substr(0, split); 26 string deno = fraction.substr(split + 1); 27 numerator.push_back(stoi(num)); 28 denominator.push_back(stoi(deno)); 29 } 30 int lcm_num = denominator[0]; 31 for (int i = 1; i < denominator.size(); i++) { 32 int temp = lcm(lcm_num, denominator[i]); 33 if (temp > lcm_num) lcm_num = temp; 34 } 35 int sum = 0; 36 for (int i = 0; i < numerator.size(); i++) { 37 numerator[i] = numerator[i] * (lcm_num / denominator[i]); 38 sum += numerator[i]; 39 } 40 int gcd_num = gcd(abs(sum), lcm_num); 41 string answer = to_string(sum / gcd_num) + "/" + to_string(lcm_num / gcd_num); 42 return answer; 43 } 44 };