用于表示分数的Rational类(java)

public class Rational extends Number implements Comparable {
  // Data fields for numerator and denominator
  private long numerator = 0;
  private long denominator = 1;

  /** Construct a rational with default properties */
  public Rational() {
    this(0, 1);
  }

  /** Construct a rational with specified numerator and denominator */
  public Rational(long numerator, long denominator) {
    long gcd = gcd(numerator, denominator);
    this.numerator = ((denominator > 0) ? 1 : -1) * numerator / gcd;
    this.denominator = Math.abs(denominator) / gcd;
  }

  /** Find GCD of two numbers */
  private static long gcd(long n, long d) {
    long n1 = Math.abs(n);
    long n2 = Math.abs(d);
    int gcd = 1;

    for (int k = 1; k <= n1 && k <= n2; k++) {
      if (n1 % k == 0 && n2 % k == 0)
        gcd = k;
    }

    return gcd;
  }

  /** Return numerator */
  public long getNumerator() {
    return numerator;
  }

  /** Return denominator */
  public long getDenominator() {
    return denominator;
  }

  /** Add a rational number to this rational */
  public Rational add(Rational secondRational) {
    long n = numerator * secondRational.getDenominator() +
      denominator * secondRational.getNumerator();
    long d = denominator * secondRational.getDenominator();
    return new Rational(n, d);
  }

  /** Subtract a rational number from this rational */
  public Rational subtract(Rational secondRational) {
    long n = numerator * secondRational.getDenominator()
      - denominator * secondRational.getNumerator();
    long d = denominator * secondRational.getDenominator();
    return new Rational(n, d);
  }

  /** Multiply a rational number to this rational */
  public Rational multiply(Rational secondRational) {
    long n = numerator * secondRational.getNumerator();
    long d = denominator * secondRational.getDenominator();
    return new Rational(n, d);
  }

  /** Divide a rational number from this rational */
  public Rational divide(Rational secondRational) {
    long n = numerator * secondRational.getDenominator();
    long d = denominator * secondRational.numerator;
    return new Rational(n, d);
  }

  /** Override the toString() method */
  public String toString() {
    if (denominator == 1)
      return numerator + "";
    else
      return numerator + "/" + denominator;
  }

  /** Override the equals method in the Object class */
  public boolean equals(Object parm1) {
    if ((this.subtract((Rational)(parm1))).getNumerator() == 0)
      return true;
    else
      return false;
  }

  /** Override the abstract intValue method in java.lang.Number */
  public int intValue() {
    return (int)doubleValue();
  }

  /** Override the abstract floatValue method in java.lang.Number */
  public float floatValue() {
    return (float)doubleValue();
  }

  /** Override the doubleValue method in java.lang.Number */
  public double doubleValue() {
    return numerator * 1.0 / denominator;
  }

  /** Override the abstract longValue method in java.lang.Number */
  public long longValue() {
    return (long)doubleValue();
  }

  /** Override the compareTo method in java.lang.Comparable */
  public int compareTo(Object o) {
    if ((this.subtract((Rational)o)).getNumerator() > 0)
      return 1;
    else if ((this.subtract((Rational)o)).getNumerator() < 0)
      return -1;
    else
      return 0;
  }
}

转自<<Java语言程序设计>>  


自己改写的BigInteger版本  :

几万都要数十秒钟```BigInteger处理太慢 没什么用处

未进行深入测试


import java.math.BigDecimal;
import java.math.BigInteger;

/**
 * Created by longforus on 4:04 PM 6/14/2016 .
 * IDEA-Test .
 * Rational With BigInteger  edition
 * 数值太大计算极其缓慢  没有太大是实用价值
 */
public class Rational  extends Number implements Comparable {
    // Data fields for numerator and denominator
    private BigInteger[] rational ={BigInteger.ZERO,BigInteger.ONE};

    /** Construct a rational with default properties */
    public Rational() {
    }

    /** Construct a rational with specified numerator and denominator */
    public Rational(BigInteger numerator, BigInteger denominator) {
         BigInteger gcd = gcd(numerator, denominator);
        rational[0] = ((denominator.compareTo (BigInteger.ZERO) > 0) ? BigInteger.ONE : new BigInteger ("-1")) .multiply (numerator).divide (gcd);
        rational[1] = denominator.abs ().divide (gcd);
    }

    /** Find GCD of two numbers */
    private static BigInteger gcd(BigInteger n, BigInteger d) {
        BigInteger n1 =  n.abs();
        BigInteger n2 =  d.abs();
        BigInteger gcd = BigInteger.ONE,k =BigInteger.ONE;

        for (; n1.compareTo (k)>=0 && n2.compareTo (k)>=0 ; k = k.add (BigInteger.ONE)) {
            if (n1.remainder (k).equals (BigInteger.ZERO) && n2.remainder (k).equals (BigInteger.ZERO))
                      gcd = k;
        }

        return gcd;
    }

    /** Return numerator */
    public BigInteger getNumerator() {
        return rational[0];
    }

    /** Return denominator */
    public BigInteger getDenominator() {
        return rational[1];
    }

    /** Add a rational number to this rational */
    public Rational add(Rational secondRational) {
        BigInteger n = (rational[0] .multiply (secondRational.getDenominator() ) ).add (rational[1].multiply (secondRational.getNumerator()));
        BigInteger d = rational[1].multiply ( secondRational.getDenominator());
        return new Rational(n, d);
    }

    /** Subtract a rational number from this rational */
    public Rational subtract(Rational secondRational) {
        BigInteger n = (rational[0] .multiply (secondRational.getDenominator() ) ).subtract (rational[1].multiply (secondRational.getNumerator()));
        BigInteger d = rational[1].multiply ( secondRational.getDenominator());
        return new Rational(n, d);
    }

    /** Multiply a rational number to this rational */
    public Rational multiply(Rational secondRational) {
        BigInteger n = rational[0].multiply ( secondRational.getNumerator ());
        BigInteger d = rational[1].multiply ( secondRational.getDenominator());
        return new Rational(n, d);
    }

    /** Divide a rational number from this rational */
    public Rational divide(Rational secondRational) {
        BigInteger n =rational[0].multiply ( secondRational.getDenominator());
        BigInteger d = rational[1].multiply (secondRational.rational[0])  ;
        return new Rational(n, d);
    }

    /** Override the toString() method */
    public String toString() {
        if (rational[1].equals (BigInteger.ONE))
            return rational[0]  + "";
        else
            return rational[0]  + "/" + rational[1];
    }

    /** Override the equals method in the Object class */
    public boolean equals(Object parm1) {
        if ((this.subtract((Rational)(parm1))).getNumerator().equals (BigInteger.ZERO) )
            return true;
        else
            return false;
    }

    /** Override the abstract intValue method in java.lang.Number */
    public int intValue() {
        return (int)doubleValue();
    }

    /** Override the abstract floatValue method in java.lang.Number */
    public float floatValue() {
        return (float)doubleValue();
    }

    /** Override the doubleValue method in java.lang.Number 這里会出现算数异常*/
    public double doubleValue() throws  ArithmeticException{
        BigDecimal  r0 = new BigDecimal (rational[0]), r1 = new BigDecimal (rational[1]);
        return r0.divide (r1).doubleValue () ;
    }

    /** Override the abstract BigIntegerValue method in java.lang.Number */
    public long longValue() {
        return (long)doubleValue();
    }

    /** Override the compareTo method in java.lang.Comparable */
    public int compareTo(Object o) {
        if ((this.subtract((Rational)o)).getNumerator().compareTo (BigInteger.ZERO) > 0)
            return 1;
        else if ((this.subtract((Rational)o)).getNumerator().compareTo (BigInteger.ZERO)  < 0)
            return -1;
        else
            return 0;
    }
}


  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值