#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
struct Fraction {
int up, down;
Fraction() {}
Fraction(int Up, int Down) : up(Up), down(Down) {}
};
Fraction reduction(Fraction result) {
if (result.down < 0) {
result.up = -result.up;
result.down = -result.down;
}
if (result.up == 0)
result.down = 1;
else {
int d = gcd(abs(result.up), abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
Fraction add(Fraction f1, Fraction f2) {
Fraction result;
result.up = f1.up * f2.down + f2.up * f1.down;
result.down = f1.down * f2.down;
result = reduction(result);
return result;
}
int s_to_num(string s) {
int res = 0;
for (int i = 0; i < s.size(); i++) {
res = res * 10 + s[i] - '0';
}
return res;
}
Fraction handle_string(string str) {
Fraction result;
int flag = 1;
if (str[0] == '-') {
flag = -1;
str = str.substr(1);
}
int index = str.find('/');
result.up = flag * s_to_num(str.substr(0, index));
result.down = s_to_num(str.substr(index + 1));
return reduction(result);
}
string fractionAddition(string expression) {
queue<Fraction> q;
int begin = 0;
for (int i = 0; i < expression.length(); i++) {
if (i != 0) {
if (expression[i] == '+' || expression[i] == '-') {
string s = expression.substr(begin, i - begin);
q.push(handle_string(s));
begin = i;
if (expression[i] == '+') begin++;
}
}
}
q.push(handle_string(expression.substr(begin)));
while (q.size() > 1) {
Fraction a = q.front();
q.pop();
Fraction b = q.front();
q.pop();
q.push(add(a, b));
}
Fraction result = q.front();
q.pop();
string final_str = "";
final_str += to_string(result.up);
final_str += '/';
final_str += to_string(result.down);
return final_str;
}
int main() {
string s, final_str;
cin >> s;
final_str = fractionAddition(s);
cout << final_str << endl;
return 0;
}
592.分数加减法
最新推荐文章于 2024-07-10 22:49:54 发布