JAVA程序设计:分数加减运算(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 位整数范围内的有效整数。

思路:直接模拟分子加法过程即可,唯一烦的地方就是字符串的处理啦

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);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值