用于表示分数的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; } }
相关文章推荐
- java运算符优先级表
- Java序列化的作用和反序列化
- java利用反射扩展任意数组的方法
- java修饰符汇总
- java中集合的分类
- java中有关内部类的相关问题
- 自己动手设计java web框架(二)-自定义注解以及通过反射获取注解
- 自己动手设计java web框架(三)-执行请求路径所对应方法并返回
- 完美的java解决下载文件问题
- Java Lambda
- spring定时任务实现
- Java-日志-JdkLogging
- MyEclipse将Java项目打包成jar文件的三种方法
- Java中的代理
- springmvc原理及struts2比较&案例&整合&逆向工程&乱码&时间类型转换
- java.sql.Connection.close() vs null
- java AWT容器测试-Frame
- java AWT容器测试-Panel
- java AWT容器测试-ScrollPane
- Java之递归求和的两张方法