Java中有理数类Rational Number详解

350 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 ​

这里的各个方法之间都有很紧密的联系,小伙伴们要耐心地来回推敲哦

/**
 * Created with IntelliJ IDEA.
 * Description: Hello,I would appreciate your comments~
 * User: 葛玉礼
 * Date: 2022-03-19
 * Destination:有理数之间的运算
 */
public class RationalNumber {
    private int numerator;//分子
    private int denominator;//分母
    public RationalNumber(int numer, int denom){
        if(denom == 0){
            denom = 1;
        }
        if(denom < 0){
            numer = numer * -1;
            denom = denom * -1;
        }
        numerator = numer;
        denominator = denom;
        reduce();//这个方法后面会写到
    }
//    构建函数,用来初始化
    public int getNumerator(){
        return numerator;
//    返回分子
    }
    public  int getDenominator(){
        return  denominator;
//    返回分母
    }
    public RationalNumber reciprocal(){
        return new RationalNumber(denominator,numerator);
//    这里返回值类型为本RationalNumber类返回值类型,分子分母位置调换,所以方法作用为返回倒数
    }
    public RationalNumber add(RationalNumber op2){
        int commonDenominator = denominator * op2.getDenominator();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        int sum = numerator1 + numerator2;
        return new RationalNumber(sum,commonDenominator);
//    和作为分子,分母之积作为分母
    }
    public RationalNumber subtract(RationalNumber op2){
        int commonDenominator = denominator * op2.getDenominator();
        int numerator1 = numerator * op2.getDenominator();
        int numerator2 = op2.getNumerator() * denominator;
        int difference = numerator1 - numerator2;
        return new RationalNumber(difference,commonDenominator);
    }
//    以上为有理数的减法运算
    public RationalNumber multiply(RationalNumber op2){
        int numer = numerator * op2.getNumerator();
        int denom = denominator * op2.getDenominator();
        return new RationalNumber(numer,denom);
    }
//    以上为有理数的乘法运算
    public RationalNumber divide (RationalNumber op2){
        return multiply(op2.reciprocal());
//     有理数的除法,除一个数则是乘这个数的倒数
    }
    public boolean isLike(RationalNumber op2){
        return (numerator == op2.getNumerator()&&denominator == op2.getDenominator());
    }
//    确定此有理数是否等于作为参数传递的有理数,假设在两者都被化简过的情况下
    public String toString (){
        String result;
        if (numerator == 0){
            result = "0";
        }else if(denominator == 1){
            result = numerator +"";
        }else {
            result = numerator + "/" + denominator;
        }
        return result;
//     将有理数转化为字符串
    }
    private void reduce(){
        if(numerator != 0){
            int common = gcd(Math.abs(numerator),denominator);
            numerator = numerator / common;
            denominator = denominator / common;
        }
    }
//    重要的动作:化简,这里的gcd为返回最大公因数
    private int gcd(int num1, int num2){
        while (num1 != num2){
            if(num1>num2){
                num1 = num1 - num2;
            }else {
                num2 = num2 - num1;
            }
        }
        return num1;
    }
}

然后我们再来进行对它的一个测试

/**
 * Created with IntelliJ IDEA.
 * Description: Hello,I would appreciate your comments~
 * User: 葛玉礼
 * Date: 2022-03-19
 * Destination:这是一个利用有理数方法来解释依赖概念的类
 */
public class RationalTest {
//    我们进一步利用有理数的类中的方法来解释我们的概念
    public static void main(String[] args) {
        RationalNumber r1 = new RationalNumber(6,8);
        RationalNumber r2 = new RationalNumber(1,3);
        RationalNumber r3, r4, r5 ,r6, r7;
        System.out.println("First rational number:" + r1);
        System.out.println("Second rational number:" + r2);
        if(r1.isLike(r2)){
            System.out.println("r1 and r2 are equal.");
        }else {
            System.out.println("r1 and r2 are not equal.");
            r3 = r1.reciprocal();
            r4 = r1.add(r2);
            r5 = r1.subtract(r2);
            r6 = r1.multiply(r2);
            r7 = r1.divide(r2);
            System.out.println("r1 + r2 = " + r4);
            System.out.println("r1 - r2 = " + r5);
            System.out.println("r1 * r2 = " + r6);
            System.out.println("r1 / r2 = " + r7);
        }
    }
}

测试结果为

r1 and r2 are not equal.
r1 + r2 = 13/12
r1 - r2 = 5/12
r1 * r2 = 1/4
r1 / r2 = 9/4