算法-第四版-练习1.2.16解答

时间:2023-02-13 13:03:47

有理数。为有理数实现一个不可变数据类型Rational,支持加减乘除操作。

无需测试溢出。

/**
 * Description : 
 * Author      : mn@furzoom.com
 * Date        : Sep 27, 2016 2:19:35 PM
 * Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
 */
package com.furzoom.lab.algs.ch102;

/**
 * ClassName    : E10216 <br>
 * Function     : TODO ADD FUNCTION. <br>
 * date         : Sep 27, 2016 2:19:35 PM <br>
 * 
 * @version 
 */
public class E10216
{
    
    public static void main(String[] args)
    {
        Rational r = new Rational(2, -6);
        System.out.println(r);
        Rational r1 = new Rational(1, 5);
        Rational r2 = new Rational(-1, 15);
        System.out.println(r.plus(r1));
        System.out.println(r.plus(r2).plus(r1));
        System.out.println(r.minus(r1));
        System.out.println(r.times(r1));
        System.out.println(r.divides(r1));
        System.out.println(r.times(r1).equals(r2));
        r = new Rational(0, 2);
        System.out.println(r);
        System.out.println(r.plus(r1));
        
        r1 = new Rational(1, 3);
        r2 = new Rational(2, 3);
        System.out.println(r1.plus(r2));
        
        r1 = new Rational(1, 200000000);
        r2 = new Rational(1, 300000000);
        System.out.println(r1.plus(r2));
        
        r1 = new Rational(1073741789, 20);
        r2 = new Rational(1073741789, 30);
        System.out.println(r1.plus(r2));
        
        
    }
}

class Rational
{
    private final long num;
    private final long den;
    
    public Rational(long numerator, long denominator)
    {
        if (denominator == 0)
            throw new RuntimeException("Denominator is zero");
        long g = gcd(numerator, denominator);
        
        if (denominator < 0)
            g = -g;
        
        this.num = numerator / g;
        this.den = denominator / g;
    }
    
    public Rational plus(Rational b)
    {
        long d = den * b.den;
        long n = num * b.den + den * b.num;
        return new Rational(n, d);
    }
    
    public Rational minus(Rational b)
    {
        long d = den * b.den;
        long n = num * b.den - den * b.num;
        return new Rational(n, d);
    }
    
    public Rational times(Rational b)
    {
        return new Rational(num * b.num, den * b.den);
    }
    
    public Rational divides(Rational b)
    {
        return new Rational(num * b.den, den * b.num);
    }
    
    public boolean equals(Rational that)
    {
        if (this == that) return true;
        if (that == null) return false;
        if (this.getClass() != that.getClass()) return false;
        return (num == that.num && den == that.den); 
    }
    
    private static long gcd(long m, long n)
    {
        if (m < 0) m = -m;
        if (n < 0) n = -n;
        if (n == 0) return m;
        return gcd(n, m % n);
    }
    
    public String toString()
    {
        if (this.den == 1)
            return String.format("%d", this.num);
        return String.format("%d/%d", this.num, this.den);
    }
    
}


算法-第四版-1.2 数据抽象-习题索引汇总

算法-第四版习题索引汇总