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


    有理数。为有理数实现一个不可变数据类型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 数据抽象-习题索引汇总

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

  • 相关阅读:
    第三次作业
    Mysql show variables系统变量详解
    利用正则检测文中敏感词并标红
    Android 连接大疆SDK
    Android 热修复方案Tinker
    Hander消息机制
    .net MemCache 入门到简单使用链接汇总
    用socket连接pop3服务器遇到的小问题
    我是如何取得Reflector的真实程序的
    google卫星地图的url计算
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710213.html
Copyright © 2020-2023  润新知