给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 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);
}
};