问题原文https://leetcode-cn.com/problems/fraction-addition-and-subtraction/description/
代码主要分为三个部分
一、最简分数比需要用到辗转相除法,求出最大公因数。所以第一个函数用来获取两者之间的最大公因数
二、获取一个字符串里面的第一个分数
三、递归进行计算
public int division(int a,int b) {
//a>=b
//System.out.println("a = "+a+" b = "+b);
int r = a%b;
while(r!=0) {
int tmp = r;
r = b%r;
b = tmp;
}
return b;
}
public int[] fraHel(String expression) {
//用于保存分数的分子分母
int[] res = new int[3];
int i = 0;
if(expression.charAt(i) == '-' || expression.charAt(i) == '+') {
i++;
}
//System.out.println("step1");
String aHel = new String();
while(expression.charAt(i)!='/') {
aHel+=String.valueOf(expression.charAt(i++));
}
res[0] = Integer.valueOf(aHel);
if(expression.charAt(0) == '-') res[0] = -res[0];
//System.out.println("step2 "+res[0]);
//这一步是为了跳过'/'
i++;
String bHel = new String();
while(i<expression.length()&&expression.charAt(i)!='+'&&expression.charAt(i)!='-') {
bHel+=String.valueOf(expression.charAt(i++));
}
res[1] = Integer.valueOf(bHel);
//System.out.println("step3 "+res[1]);
res[2] = i;
//System.out.println("pos "+i);
return res;
}
public String fractionAddition(String expression) {
//System.out.println("expression= "+expression);
//如果字符串只剩下一个分数就直接返回计算,最长的例子可以是-10/3,所以是长度5
if(expression.length()<=5) return expression;
//分别记录两个分数的分子分母
int[] t1 = fraHel(expression);
//记录返回值,用于计算
String expressionNew = fractionAddition(expression.substring(t1[2]));
int[] t2 = fraHel(expressionNew);
//保存计算后的结果
StringBuilder res = new StringBuilder();
int up = t1[0]*t2[1]+t2[0]*t1[1];
int down = t1[1]*t2[1];
//System.out.println("up="+up+" down="+down);
if(up<0) res.append('-');
up = Math.abs(up);
if(up!=0) {
int r = division(up>=down?up:down,up>=down?down:up);
System.out.println("r"+r);
res.append(up/r);
res.append('/');
res.append(down/r);
}else {
res.append(up);
res.append('/');
res.append(1);
}
return res.toString();
}