1088. Rational Arithmetic (20)

import java.math.BigInteger;
import java.util.Scanner;
import java.util.regex.MatchResult;

class Rational {
	BigInteger n, d;
}

public class Main {
	
	public static Rational add(Rational r1, Rational r2) {
		BigInteger gcd = r1.d.gcd(r2.d);
		BigInteger q1 = r1.d.divide(gcd);
		BigInteger q2 = r2.d.divide(gcd);
		
		Rational sum = new Rational();
		sum.n = r1.n.multiply(q2).add(r2.n.multiply(q1));
		sum.d = r1.d.multiply(q2);
		
		return sum;
	}
	
	public static Rational sub(Rational r1, Rational r2) {
		Rational r = new Rational();
		r.n = r2.n.negate();
		r.d = r2.d;
		return add(r1, r);
	}
	
	public static Rational multiply(Rational r1, Rational r2) {
		Rational r = new Rational();
		r.n = r1.n.multiply(r2.n);
		r.d = r1.d.multiply(r2.d);
		return r;
	}
	
	public static Rational divide(Rational r1, Rational r2) {
		Rational r = new Rational();
		r.n = r2.d;
		r.d = r2.n;
		return multiply(r1, r);
	}
	
	public static void printRational(Rational rr) {
		
		Rational r = new Rational();
		r.n = rr.n;
		r.d = rr.d;
		
		if(r.d.equals(BigInteger.ZERO)) {
			System.out.print("Inf");
		}
		else if(r.n.equals(BigInteger.ZERO)) {
			System.out.print("0");
		}
		else {
			if(r.d.compareTo(BigInteger.ZERO) < 0) {
				r.n = r.n.negate();
				r.d = r.d.negate();
			}
			boolean sign = r.n.compareTo(BigInteger.ZERO) > 0;
			if(!sign) {
				r.n = r.n.negate();
			}
			
			BigInteger gcd = r.n.gcd(r.d);
			r.n = r.n.divide(gcd);
			r.d = r.d.divide(gcd);
			
			
			BigInteger qr[] = r.n.divideAndRemainder(r.d);
			
			if(sign) {
				if(qr[0].equals(BigInteger.ZERO)) {
					System.out.format("%s/%s", r.n.toString(), r.d.toString());
				}
				else {
					if(!qr[1].equals(BigInteger.ZERO))
						System.out.format("%s %s/%s",  qr[0].toString(), qr[1].toString(), r.d.toString());
					else
						System.out.format("%s", qr[0].toString());
				}
			}
			else {
				if(qr[0].equals(BigInteger.ZERO)) {
					System.out.format("(-%s/%s)", r.n.toString(), r.d.toString());
				}
				else {
					if(!qr[1].equals(BigInteger.ZERO))
						System.out.format("(-%s %s/%s)",  qr[0].toString(), qr[1].toString(), r.d.toString());
					else
						System.out.format("(-%s)",  qr[0].toString());
				}
			}
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in).useDelimiter("[ \r\n/]");

		Rational[] list = new Rational[2];
		for(int i = 0; i < 2; i ++) {
			list[i] = new Rational();
			list[i].n = scanner.nextBigInteger();
			list[i].d = scanner.nextBigInteger();
		}
		
		Rational r[] = new Rational[4];
		r[0] = add(list[0], list[1]);
		r[1] = sub(list[0], list[1]);
		r[2] = multiply(list[0], list[1]);
		r[3] = divide(list[0], list[1]);
		
		String op = "+-*/";
		
		for(int i = 0; i < 4; i ++) {
			printRational(list[0]);
			System.out.format(" %c ", op.charAt(i));
			printRational(list[1]);
			System.out.print(" = ");
			printRational(r[i]);
			System.out.println();
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值