【java】592. Fraction Addition and Subtraction

问题原文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();
    }

猜你喜欢

转载自blog.csdn.net/amber804105/article/details/81508811