本题源自leetcode 592
-----------------------------------------------------------------
思路: 1 求分数表达式,用istringstream 类读输入的表达式。
2 求表达式的结果。
3 除以最大公约数(简化)
代码:
string fractionAddition(string expression) {
istringstream is(expression);
int dvd = 0; //保存最终结果的分母
int dis = 1; //保存最终结果的分子
int a=0;
int b=0;
char op; //存操作符
while(is >> a >> op >> b){
dvd = dvd * b + dis * a;
dis *= b;
int g = abs(__gcd(dvd,dis)); //最大公约数
dvd /= g;
dis /= g;
}
return to_string(dvd) + '/' +to_string(dis);
}
代码
string fractionAddition(string s) {
int p = 0, p1 = 0, p2 = 0;
int n = 0, d = 1; //分母 和 分子
if(s[0] != '-')
s = "+" + s;
int len = s.size();
while(p < len){
for(p1 = p + 1; s[p1] != '/'; ++p1);
for(p2 = p1 + 1; p2 < len && s[p2] != '-' && s[p2] != '+'; ++p2);
auto nn = stoi(s.substr(p + 1, p1 - p - 1)); //分母
auto dd = stoi(s.substr(p1 + 1, p2 - 1 -p1)); //分子
auto g = getGcd(d,dd);
n = (n * dd) / g + ((s[p] == '-' ? -1 : 1) * nn * d) / g; //求和后的分母
d = (d * dd) / g; //求和后的分子
p = p2;
}
auto g = getGcd(abs(n),d);
return to_string(n/g) + "/" + to_string(d/g);
}
int getGcd(int a,int b){
return b==0 ? a : getGcd(b,a%b);
}