(欧几里得算法)Rational API实现(1216)

来源:互联网 发布:linux中makefile文件 编辑:程序博客网 时间:2024/06/10 20:34
有理数:正整数、负整数、正分数、负分数以及零的统称。
有理数是一个整数a和一个正整数b,例如3/8,通则为a/b。0也是有理数。有理数是整数和分数的集合,整数也可看做是分母为一的分数。
有理数与分数的区别,分数是一种比值的记法。可以是无理数,例如根号2/1。
有理数的小数部分是有限或为无限循环的数。不是有理数的实数称为无理数,即无理数的小数部分是无限不循环的数。


Arithmetic 数学
numerator 分子
denominator 分母
Divisor 因数

assert:断言
格式:    assert <布尔表达式> : <错误信息表达式>

这里主要是考虑了加法plus和乘法times的溢出overflow问题:
1.加法plus: a >= 0 就要考虑 a + b < MAX ;   
                     a < 0 就要考虑 a + b > MIN;
2.乘法times:主要是考虑分母一定要为正数,不可以为负数。

代码如下:

package chapter1.a2;


import edu.princeton.cs.algs4.StdIn;

/**
* Created by fengjw on 2017/7/29.
*/
public class Rational {

private int numerator;
private int denominator;
private int MAX =2147483647;
private int MIN = -2147483648;

public Rational(int numerator, int denominator)throws ArithmeticException{
if (denominator == 0){
throw new ArithmeticException("Divide by zero.");
}

//分母不能为0
if (denominator < 0){
denominator = -denominator;
numerator = -numerator;
}

/*
这里是求分子和分母去掉公因子的最简形式
(保证分子分母没有公因子)
*/
int commonDivisor = Enclid(numerator,denominator);// 最大公约数Divisor
this.numerator = numerator / commonDivisor;
this.denominator = denominator / commonDivisor;

}


//plus
public Rational plus(Rational b){ //assert 断言 assert <boolean表达式> : <错误信息表达式>
assert isPlusOverflow(numerator * b.denominator, b.numerator *denominator) : "Plus overflow";
assert isTimesOverflow(denominator, b.denominator) :"Times overflow";
int n = numerator * b.denominator +denominator * b.numerator;
int d = denominator * b.denominator;
return new Rational(n,d);
}

//minus
public Rational minus(Rational b){
return new Rational(numerator * b.denominator - b.numerator *denominator,denominator * b.denominator);
}

//times
public Rational times(Rational b){
assert isTimesOverflow(numerator, b.numerator) :"Times overflow";
assert isTimesOverflow(denominator, b.denominator) :"Times overflow";
return new Rational(numerator * b.numerator,denominator * b.denominator);
}

public Rational divides(Rational b){
return new Rational(numerator * b.denominator,denominator * b.numerator);
}

public boolean equlas(Object object){

if (this == object){
return true;
}

if (object == null){
return false;
}

if (this.getClass() != object.getClass()){
return false;
}

Rational that = (Rational) object;
if (this.numerator != that.numerator){
return false;
}

if (this.denominator != that.denominator){
return false;
}
return true;
}

//默认一定会执行的方法。
public String toString(){
if (Math.abs(numerator) % Math.abs(denominator) ==0){
return String.valueOf(numerator /denominator);
}else {
return numerator +"/" + denominator;
}
}

private int Enclid(int p, int q){
if (p == 0 || q ==0)
return 1;
p = Math.abs(p);
q = Math.abs(q);
if(p < q){
int temp = q;
q = p;
p = temp;
}
if (p % q == 0){
return q;
}else {
return Enclid(q, p % q);
}
}

private boolean isPlusOverflow(int a, int b){
return a >= 0 ? a + b <MAX : a + b > MIN;
}

private boolean isTimesOverflow(int a, int b){
if (a < 0)
a = -a;
if (b < 0)
b = -b;
if (a == 0 || b ==0){
return false;
}else {
return a * b < MAX;
}
}


public static void main(String [] args){
System.out.println("Rational a:");
System.out.print("numerator: ");
int numerator = StdIn.readInt();
System.out.print("denominator: ");
int denominator = StdIn.readInt();
Rational a = new Rational(numerator, denominator);
System.out.println("Rational b:");
System.out.print("numerator: ");
numerator = StdIn.readInt();
System.out.print("denominator: ");
denominator = StdIn.readInt();
Rational b = new Rational(numerator, denominator);
System.out.println("a plus b: " + a.plus(b));
System.out.println("a minus b: " + a.minus(b));
System.out.println("a times b: " + a.times(b));
System.out.println("a divides b: " + a.divides(b));
System.out.println("a equals b: " + a.equals(b));
}
}