给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 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 {
private long ans1,ans2;
public String fractionAddition(String expression) {
long a=0,b=0;
ans1=0;ans2=0;
boolean flag=false,mark=false;
for(int i=0;i<expression.length();i++) {
if(expression.charAt(i)=='/') {
a=mark?-a:a;
flag=true;
mark=false;
continue;
}
if(expression.charAt(i)=='-' || expression.charAt(i)=='+') {
work(ans1,ans2,a,b); a=0;b=0; flag=false;
if(expression.charAt(i)=='-') mark=true;
continue;
}
if(!flag) a=a*10+expression.charAt(i)-'0';
else b=b*10+expression.charAt(i)-'0';
if(i==expression.length()-1) work(ans1,ans2,a,b);
}
if(ans2==0) ans2=1;
StringBuilder str=new StringBuilder();
str.append(String.valueOf(ans1));
str.append('/');
str.append(String.valueOf(ans2));
return str.toString();
}
private void work(long a,long b,long c,long d) {
if(b==0 && a==0) { ans1=c; ans2=d; return; }
//System.out.println(a+" "+b+" "+c+" "+d);
long res1=a*d+b*c;
long res2=b*d;
boolean flag=false;
if(res1<0) { flag=true; res1=-res1;};
long tmp=gcd(res1,res2);
ans1=res1/tmp; ans2=res2/tmp;
if(flag) ans1=-ans1;
//System.out.println(res1+" "+res2);
}
private long gcd(long a,long b) {
if(b==0) return a;
return gcd(b,a%b);
}
}