美文网首页
1.2.16 有理数,支持加减乘除操作

1.2.16 有理数,支持加减乘除操作

作者: 风亡小窝 | 来源:发表于2016-06-16 16:42 被阅读22次

这题的关键在于:

  1. 最大公约数
  2. 最小公倍数
  3. 通分

public class Rational {
    private final int numerator;
    private final int denominator;
    
    public Rational(int numerator, int denominator) {
        this.numerator = numerator;
        this.denominator = denominator;
    }
    
    /**
     * 和
     * @param b
     * @return
     */
    public Rational plus(Rational b){
        Rational[] operand = rfcd(this, b); 
        int newNumerator = operand[0].numerator + operand[1].numerator;
        int newDenominator = operand[0].denominator;    
        return reduction(new Rational( newNumerator , newDenominator));
    }
    
    /**
     * 差
     * @param b
     * @return
     */
    public Rational minus(Rational b){
        Rational[] operand = rfcd(this, b); 
        int newNumerator = operand[0].numerator - operand[1].numerator;
        int newDenominator = operand[0].denominator;    
        return reduction(new Rational( newNumerator , newDenominator));
    }
    
    /**
     * 积
     * @param b
     * @return
     */
    public Rational times(Rational b){
        Rational[] operand = rfcd(this, b); 
        int newNumerator = operand[0].numerator * operand[1].numerator;
        int newDenominator = operand[0].denominator * operand[0].denominator;
        return reduction(new Rational( newNumerator , newDenominator));
    }
    
    /**
     * 商
     * @param b
     * @return
     */
    public Rational divides(Rational b){
        Rational[] operand = rfcd(this, b);     
        int newNumerator = operand[0].numerator;
        int newDenominator = operand[1].numerator;
        return reduction(new Rational( newNumerator , newDenominator));
    }
    
    public boolean equals(Rational b){
        if(this == b) return true;
        Rational[] operand = rfcd(this, b);
        
        return operand[0].numerator == operand[1].numerator;
    }
    
    public String toString(){
        return "" + this.numerator + "/" + this.denominator;
    }
    
    /**
     * 最大公约数(greatest common divisor)
     * @param p
     * @param q
     * @return
     */
    private int gcd(int p, int q){
        if (q == 0) return p;
        return gcd(q, p%q);
    }
    
    /**
     * 最小公倍数(lowest common multiple)
     * @param a
     * @param b
     * @return
     */
    private int lcm(int a, int b){
        return (a * b) / gcd(a, b);
    }
    
    /**
     * 通分(reduction of fractions to a common denominator)
     * @param a
     * @param b
     * @return
     */
    private Rational[] rfcd(Rational a, Rational b){
        int lcm = lcm(a.denominator, b.denominator);
        int aNewNumerator = a.numerator * (lcm/a.denominator);
        int bNewNumerator = b.numerator * (lcm/b.denominator);      
        return new Rational[]{new Rational(aNewNumerator, lcm), new Rational(bNewNumerator, lcm)};
    }
    
    /**
     * 化简(reduction)
     * @param a
     * @return
     */
    private Rational reduction(Rational a){
        int gcd = gcd(a.numerator, a.denominator);      
        return new Rational(a.numerator/gcd, a.denominator/gcd);
    }
}

相关文章

  • 1.2.16 有理数,支持加减乘除操作

    这题的关键在于: 最大公约数 最小公倍数 通分

  • Scala学习笔记4——类和对象(二)

    有理数类的表示 实现规范:支持有理数的加减乘除,并支持有理数的规范表示 1.定义Rational 首先,考虑用户如...

  • 辗转相除法的应用

    题目: 设计实现抽象数据结构"有理数",基本操作包括有理数的加减乘除,以及求有理数的分子分母 思路: 设计这个数据...

  • 有理数的加减

    要算有理数的加减乘除就必须要先知道有理数需要分成几类,或者说有理数是什么?其实有理数去除了无限不循环小数外的数。就...

  • Python -- 数据类型

    Comment 在 python 中,注释以 # 开头 Number Python 中支持的数字操作: 加减乘除 ...

  • 关于FastJSON 使用serializeUsing自定义序列

    在fastjson 1.2.16版本之后,JSONField支持新的定制化配置serializeUsing,可以单...

  • 有理数的加减乘除

    从小学到初中,我们学过了很多种类型的数,并且不断的在进行了归纳与总结,一点一点的扩大这种数类的范围。而到了初...

  • 有理数的加减乘除

    在步入初中之后,我对数的了解又增深了一步,由于现在我了解的数系已经不再是非负数,而是整个有理数了,所以在我们现在是...

  • 有理数的加减乘除

    从小学到初中,我们学过了很多种类型的数,并且不断的在进行了归纳与总结,一点一点的扩大这种数类的范围。而到了初...

  • 数学论文

    在上次的论文里,我们谈到了有理数的分类。在这一次的论文里,我们要讲一下有理数的加减乘除,四则运算。我们要学习四则运...

网友评论

      本文标题:1.2.16 有理数,支持加减乘除操作

      本文链接:https://www.haomeiwen.com/subject/qqimdttx.html