(欧几里得算法)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));
}
}
阅读全文
0 0
- (欧几里得算法)Rational API实现(1216)
- 欧几里得算法(C实现)
- 算法-欧几里得算法(C++实现)
- 欧几里得算法(C++)
- 数论(欧几里得算法)
- 最大公约数(欧几里得算法)
- 最大公约数(欧几里得算法)
- 欧几里得算法(+扩展)
- (扩展)欧几里得算法
- 最大公约数(欧几里得算法)
- Euclid(欧几里得)算法
- 欧几里得算法(gcd)和扩展欧几里得
- 算法学习 - 欧几里得算法(辗转相除法)(c++实现)
- 辗转相除法(欧几里得算法)java实现
- 欧几里得算法(GCD)和扩展欧几里得算法(EXGCD)
- 扩展欧几里得算法(模板)
- 求最大公约数(欧几里得算法)
- Romantic(扩展欧几里得算法)
- 向量范数和矩阵范数
- 视频图像处理光源篇
- 数据库 explain分析查询
- iframe嵌套的网页大小适应iframe
- js中call和apply用法
- (欧几里得算法)Rational API实现(1216)
- RxJava 2.x 使用最佳实践
- 将C语言源代码编译成动态链接库
- Java日期格式与字符串的转换
- 全屏蒙板添加
- 版本比较工具类(通用)
- eclipse怎么更改存储位置
- Laravel之路由(Routes)
- 50行代码实现的高性能动画定时器 raf-interval