您的位置:首页 > 编程语言 > Java开发

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

2016-07-22 00:00 615 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: