具有类体的enum poj3979

分数加减法

Description

实现两个分数的加减法

Input

输入包含多行数据 
每行数据是一个字符串,格式是"a/boc/d"。 

其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。 

数据以EOF结束 
输入数据保证合法

Output

对于输入数据的每一行输出两个分数的运算结果。 
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数

Sample Input

1/8+3/8
1/4-1/2
1/3-1/3

Sample Output

1/2
-1/4
0

import java.io.BufferedInputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		 new POJ3979().Solve() ; 
	}
}

class POJ3979{
	
	void Solve(){
		Scanner in = new Scanner(new BufferedInputStream(System.in)) ;
		PrintWriter out = new PrintWriter(System.out) ;
		Pair<Integer , Integer> res ;
		while(in.hasNext()){
			String s = in.next() ;
		    if(s.indexOf("+") != -1){
		    	res = Operation.ADD.eval(new Pair(s.charAt(0)-'0' , s.charAt(2)-'0') , 
	                   	 new Pair(s.charAt(4)-'0' , s.charAt(6)-'0')  ) ;
		    }
		    else{
		    	res = Operation.SUB.eval(new Pair(s.charAt(0)-'0' , s.charAt(2)-'0') , 
	                   	 new Pair(s.charAt(4)-'0' , s.charAt(6)-'0')  ) ;
		    }
		    if(res.first == 0)  out.println(0) ;
		    else if(res.second == 1) out.println(res.first / res.second) ;
		    else out.println(res.first + "/" + res.second) ;
		    
		  //  out.flush();
		}
		
		out.flush() ;
	}
	
}

enum Operation{
	ADD{
		@Override
		Pair<Integer, Integer> eval(Pair<Integer, Integer> a , Pair<Integer, Integer> b) {
			int mu = a.second * b.second ;
			int zi = a.first * b.second + b.first * a.second ;
			int g = gcd(mu , zi) ;
			return new Pair(zi / g , mu / g) ;
		}
	},
	SUB{
		@Override
		Pair<Integer, Integer> eval(Pair<Integer, Integer> a , Pair<Integer, Integer> b) {
			int mu = a.second * b.second ;
			int zi = a.first * b.second - b.first * a.second ;
			int g = gcd(mu , zi) ;
			if(g < 0) g *= -1 ;
			return new Pair(zi / g , mu / g) ;
		}	
	};
	
	abstract Pair<Integer , Integer> eval(Pair<Integer , Integer >a , Pair<Integer , Integer >b) ;
	
	int gcd(int x , int y){
		return y == 0 ? x : gcd(y , x % y) ;
	}
}

class Pair<U , V>{
	U first ;
	V second ;
	Pair(U first , V second) {
		this.first = first ;
		this.second = second ;
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值