Leetcode 592. 分数加减运算
题目
给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 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位整数范围内的有效整数。
题解
模拟
先找分母的最小公倍数,然后变换使两个分数的分母相同,分子进行加减,然后再求分子分母的最大公约数,进行通分。详细过程见代码
代码
int minGBS(int a,int b){ //找两个数的最小公倍数
return a*b/maxGYS(a,b);
}
int maxGYS(int a,int b){ //利用辗转相除法求两个数的最大公约数
if(a < b) swap(a,b);
int c;
while(b != 0){
c = a%b;
a = b;
b = c;
}
return a;
}
pair<int,int> addFraction(pair<int,int> one,pair<int,int> two){ //两个分式进行加减
int second = minGBS(one.second,two.second); //利用最小公倍数统一分母
int first = one.first*(second/one.second) + two.first*(second/two.second); //分子变换后进行加减
if(first == 0) return make_pair(0,1);
int isNegtive = 1;
if(first < 0){
isNegtive = -1;
first *= -1;
}
int YS = maxGYS(first,second); //求分子分母的最大公约数以便实现通分
return make_pair(isNegtive*first/YS,second/YS);
}
string fractionAddition(string expression) {
stack<pair<int,int>> sp;
int i=0,n = expression.length();
bool isNegtive = false;
while(i < n){
if(expression[i] == '-') isNegtive = true; //我们将减号看成第二个分数的负号,从而将加减法统一为加法
else if(expression[i] == '+') isNegtive = false;
else{
int first=0,second=0;
while(expression[i] != '/'){
first = first*10 + expression[i]-'0';
i++;
}
if(isNegtive) first *= -1;
i++;
while(i<n && expression[i] != '+' && expression[i]!='-'){
second = second*10 + expression[i]-'0';
i++;
}
if(sp.empty()) sp.push(make_pair(first,second));
else{
pair<int,int> conclude = addFraction(sp.top(),make_pair(first,second));
sp.pop();
sp.push(conclude);
}
i--;
}
i++;
}
return to_string(sp.top().first) + "/" + to_string(sp.top().second);
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fraction-addition-and-subtraction
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。