Java实现有理数

   有理数是由分子、分母以形式a/b表示的数(b!=0)。 Java提供了整
数和浮点数的数据类型,但没有提供有理数的类。本程序实现扩充有理数。
类图如下:
这里写图片描述
说明:
(1)由于有理数不整数和浮点数有许多共同特征,并且Number类是数值包装类的根类,因此可把有理数类Rational定义为Nnumber抽象类(java.awt.lang)的子类。由于有理数是可以比较的,那么Rational类也应实现Comparable接口
(java.awt.lang) 。
这里写图片描述
(2)Rational类应实现Nnumber类中的抽象方法intValue、longValue、 floatValue和doubleValue。这些方法返回该有理数的int、 long、 float和double值。
(3)Rational类应实现了Comparable接口中的comparaTo(Object other)方法,将这个有理数和另一个有理数进行比较。

//Rational.java

public class Rational extends Number implements Comparable<Rational>{
    private long numerator=0;//分子
    private long denominator=1;//分母

    public final int addFlag=1;//运算标记
    public final int subtractFlag=2;
    public final int multiplyFlag=3;
    public final int divideFlag=4;

    public Rational(){

    }

    public Rational(long numerator,long denominator){
        this.numerator=numerator;
        this.denominator=denominator;
    }

    public long getNumerator(){
        return numerator;
    }

    public long getDenomimator(){
        return denominator;
    }
    //加法
    public Rational add(Rational secondRational){

        return calculateResult(addFlag,this,secondRational);
    }
    //减法
    public Rational subtract(Rational secondRational){

        return calculateResult(subtractFlag,this,secondRational);
    }
    //乘法
    public Rational multiply(Rational secondRational){

        return calculateResult(multiplyFlag,this,secondRational);
    }
    //除法
    public Rational divide(Rational secondRational){

        return calculateResult(divideFlag,this,secondRational);
    }

    public String toString(){
        return this.numerator+"\\"+this.denominator;
    }

    public String show(){//假分数处理
    if(this.numerator>=this.denominator){
        long intpart=this.numerator/this.denominator;
        return "Integer part "+intpart+"    rational part "+(this.numerator-this.denominator*intpart)+"\\"+this.denominator;
    }
    return this.numerator+"\\"+this.denominator;
    }

    //有理数的转换
    public int intValue() {

         return (int)(numerator/denominator);
    }

    public long longValue() {

        return numerator/denominator;
    }

    public float floatValue() {

        return (float)numerator/denominator;
     }

    public double doubleValue() {

        return (double)numerator/denominator;
     }
    //统筹运算
    private Rational calculateResult(int flag,Rational a, Rational b) {
        long numerator=0,denominator=1;
        long gcd=gcd(a.getNumerator(),a.getDenomimator());
        long numerator1=a.getNumerator()/gcd;
        long denominator1=a.getDenomimator()/gcd;
        gcd=gcd(b.getNumerator(),b.getDenomimator());
        long numerator2=b.getNumerator()/gcd;
        long denominator2=b.getDenomimator()/gcd;

        if(flag==addFlag) {
            numerator1*=denominator2;
            numerator2*=denominator1;
            numerator=numerator1+numerator2;
            denominator=denominator1*denominator2;
            gcd=gcd(numerator,denominator);
            numerator/=gcd;
            denominator/=gcd;

        }else if(flag==subtractFlag){
            numerator1*=denominator2;
            numerator2*=denominator1;
            numerator=numerator1-numerator2;
            denominator=denominator1*denominator2;
            long tempNumerator=numerator>0?numerator:-numerator;
            gcd=gcd(tempNumerator,denominator);
            numerator/=gcd;
            denominator/=gcd;

        }else if(flag==multiplyFlag){
            numerator=numerator1*numerator2;
            denominator=denominator1*denominator2;
            gcd=gcd(numerator,denominator);
            numerator/=gcd;
            denominator/=gcd;
            }else if(flag==divideFlag){
                numerator=numerator1*denominator2;
                denominator=denominator1*numerator2;
                gcd=gcd(numerator,denominator);
                numerator/=gcd;
                denominator/=gcd;

        }else{

        }

            return new Rational(numerator,denominator);
    }
    //实现接口中的方法
    public int compareTo(Rational val) {
        long compareToResult=calculateResult(subtractFlag,this,val).getNumerator();
        if(compareToResult==0){
            return 0;
        }
        int signum=compareToResult>0?1:-1;
       return signum;
    }
    //最大公约数
    private long gcd(long n,long d){
        long temp=1;
        if (n<d){
            temp=n;
            n=d;
            d=temp;
        }

        while(temp!=0) { /* 辗转相除法求最大公约数 */
            temp=n%d; 
            n=d;  
            d=temp;
        }
        return n;
    }

} 


//RationalDemo.java
public class RationalDemo{
    public static void main(String[] args){
        Rational obj1=new Rational(2,2);
        Rational obj2=new Rational(5,4);
        System.out.println("rational1 "+obj1+"\trational2  "+obj2);
        System.out.println("假分数形式:");
        System.out.println(obj1+" + "+obj2+"= "+obj1.add(obj2));
        System.out.println(obj1+" - "+obj2+"= "+obj1.subtract(obj2));
        System.out.println(obj1+" * "+obj2+"= "+obj1.multiply(obj2));
        System.out.println(obj1+" / "+obj2+"= "+obj1.divide(obj2));

        System.out.println("带分数形式:");
        System.out.println(obj1+" + "+obj2+"= "+obj1.add(obj2).show());
        System.out.println(obj1+" - "+obj2+"= "+obj1.subtract(obj2).show());
        System.out.println(obj1+" * "+obj2+"= "+obj1.multiply(obj2).show());
        System.out.println(obj1+" / "+obj2+"= "+obj1.divide(obj2).show());

        System.out.println("其它形式:");
        System.out.println(obj1+" Integer form :   "+obj1.intValue());
        System.out.println(obj1+" Long form :   "+obj1.longValue());
        System.out.println(obj1+" Float form :   "+obj1.floatValue());
        System.out.println(obj1+" Double form :   "+obj1.doubleValue());

        System.out.println(">输出1 =输出0 <输出-1");
        System.out.println(obj1+" compare "+obj2+" result: "+obj1.compareTo(obj2));

    }
}

运行结果:
这里写图片描述

8.17 (Rational Numbers) Create a class called Rational for performing arithmetic with fractions. Write a program to test your class. Use integer variables to represent the private instance variables of the class the numerator and the denominator. Provide a constructor that enables an object of this class to be initialized when it is declared. The constructor should store the fraction in reduced form. The fraction 2/4 is equivalent to 1/2 and would be stored in the object as 1 in the numerator and 2 in the denominator. Provide a no-argument constructor with default values in case no initializers are provided. Provide public methods that perform each of the following operations: a. Add two Rational numbers: The result of the addition should be stored in reduced form. b. Subtract two Rational numbers: The result of the subtraction should be stored in reduced form. c. Multiply two Rational numbers: The result of the multiplication should be stored in reduced form. d. Divide two Rational numbers: The result of the division should be stored in reduced form. e. Print Rational numbers in the form a/b, where a is the numerator and b is the denominator. f. Print Rational numbers in floating-point format. (Consider providing formatting capabilities that enable the user of the class to specify the number of digits of precision to the right of the decimal point.) – 提示: – 有理数是有分子、分母以形式a/b表示的数,其中a是分子,b是分母。例如,1/3,3/4,10/4。 – 有理数的分母不能为0,分子却可以为0。每个整数a等价于有理数a/1。有理数用于分数的精确计算中。例如1/3=0.0000…,它不能使用数据类型double或float的浮点格式精确表示出来,为了得到准确结果,必须使用有理数。 – Java提供了整数和浮点数的数据类型,但是没有提供有理数的类型。 – 由于有理数与整数、浮点数有许多共同特征,并且Number类是数字包装的根类,因此,把有理数类Rational定义为Number类的一个子类是比较合适的。由于有理数是可比较的,那么Rational类也应该实现Comparable接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值