1088. Rational Arithmetic (20)

来源:互联网 发布:重生之娱乐网络帝国txt 编辑:程序博客网 时间:2024/05/18 13:26
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());elseSystem.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());elseSystem.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
原创粉丝点击