Java实验写一个分数类

(1)分数是指两个整数的比。分数本身可以构造和约分;任何整数都可以看作一个分数。
(2)单个分数可以运算,包括求倒数、求相反数、扩大、缩小等。
(3)两个分数可以运算,包括加减乘除等。

package wcq;

import java.math.BigInteger;

public class Fraction implements Comparable{

private int sign = 0;
private BigInteger numerator = BigInteger.ZERO;    //分数的分子
private BigInteger denominator = BigInteger.ZERO;  //分数的分母
public static final Fraction ZERO = new Fraction(0,1);
public static final Fraction ONE = new Fraction(1,1);
public static final Fraction NEGATIVE_INFINITY = new Fraction(-1,0);
public static final Fraction POSITIVE_INFINITY = new Fraction(1,0);
public static final Fraction NAN = new Fraction(0,0);public Fraction(BigInteger numerator,BigInteger denominator) {if( numerator.compareTo(BigInteger.ZERO)==-1 && denominator.compareTo(BigInteger.ZERO)==-1) {this.sign = 1;}else if( numerator.compareTo(BigInteger.ZERO)==1 && denominator.compareTo(BigInteger.ZERO)==1) {this.sign = 1;}else if( numerator.compareTo(BigInteger.ZERO)==0 && denominator.compareTo(BigInteger.ZERO)==0) {this.sign = 0;this.numerator = BigInteger.ZERO;this.denominator = BigInteger.ZERO;return;}else if( numerator.compareTo(BigInteger.ZERO)==0 ){this.sign = 0;this.numerator = BigInteger.ZERO;this.denominator = BigInteger.ONE;return;}else if( denominator.compareTo(BigInteger.ZERO)==0 && numerator.compareTo(BigInteger.ZERO)==1 ) {this.sign = 1;this.numerator = BigInteger.ONE;this.denominator = BigInteger.ZERO;return;}else if( denominator.compareTo(BigInteger.ZERO)==0 && numerator.compareTo(BigInteger.ZERO)==-1 ) {this.sign = -1;this.numerator = BigInteger.ONE;this.denominator = BigInteger.ZERO;return;}else {this.sign = -1;}numerator = numerator.abs();denominator = denominator.abs();BigInteger common = numerator.gcd(denominator);this.numerator = numerator.divide(common);this.denominator = denominator.divide(common);}public Fraction(long lNumerator,long lDenominator) {if(lNumerator < 0 && lDenominator < 0) {this.sign = 1;}else if(lNumerator > 0 && lDenominator > 0) {this.sign = 1;}else if(lNumerator == 0 && lDenominator == 0) {this.sign = 0;this.numerator = BigInteger.ZERO;this.denominator = BigInteger.ZERO;return;}else if(lNumerator == 0) {this.sign = 0;this.numerator = BigInteger.ZERO;this.denominator = BigInteger.ONE;return;}else if(lDenominator == 0 && lNumerator > 0) {this.sign = 1;this.numerator = BigInteger.ONE;this.denominator = BigInteger.ZERO;return;}else if(lDenominator == 0 && lNumerator < 0) {this.sign = -1;this.numerator = BigInteger.ONE;this.denominator = BigInteger.ZERO;return;}else {this.sign = -1;}Long lNum = lNumerator;String sNum = lNum.toString();BigInteger bNum = new BigInteger(sNum);bNum = bNum.abs();Long lDen = lDenominator;String sDen = lDen.toString();BigInteger bDen = new BigInteger(sDen);bDen = bDen.abs();BigInteger common = bNum.gcd(bDen);this.numerator = bNum.divide(common);this.denominator = bDen.divide(common);}public Fraction(long integerValue) {if(integerValue < 0) this.sign = -1;else if(integerValue > 0) this.sign = 1;else {this.sign = 0;this.numerator = BigInteger.ZERO;this.denominator = BigInteger.ONE;return;}Long lNum = integerValue;String sNum = lNum.toString();BigInteger bNum = new BigInteger(sNum);bNum = bNum.abs();this.numerator = bNum;this.denominator = BigInteger.ONE;}public int getSign() {return sign;}public BigInteger getNumerator() {return numerator;}public BigInteger getDenominator() {return denominator;}public String toString() {String s = "";if(this.sign == 1) {s = "+";}else if(this.sign == -1) {s = "-";}else if(this.sign == 0 && this.denominator.compareTo(BigInteger.ONE)==0 ) {s = "0/1";return s;}else return s;   //NANs += this.numerator.toString()+"/"+this.denominator.toString();return s;}public boolean isNaN() {if(this.sign == 0 && this.denominator.compareTo(BigInteger.ZERO)==0 ) {return true;}else return false;}public boolean isZero() {if(this.sign == 0 && this.denominator.compareTo(BigInteger.ONE)==0 ) {return true;}else return false;}public boolean isPositive() {if(this.sign == 1) {return true;}else return false;
}public boolean isNegative() {if(this.sign == -1) {return true;}else return false;
}public boolean isInfinite() {if( this.numerator.compareTo(BigInteger.ONE)==0 && this.denominator.compareTo(BigInteger.ZERO)==0 ) {return true;}else return false;}public Fraction clone() {Fraction frac = new Fraction(1,1);frac.sign = this.sign;frac.numerator = this.numerator;frac.denominator = this.denominator;return frac;}public Fraction abs() {if(this.sign < 0)this.sign = 1;return this;}public Fraction opposite() {Fraction frac = this.clone();frac.sign = 0-this.sign;return frac;}public Fraction reciprocal() {if(this.isZero()) {return Fraction.POSITIVE_INFINITY;}else if(this.isInfinite()) {return Fraction.ZERO;}else {BigInteger temp = this.numerator;this.numerator = this.denominator;this.denominator = temp;return this;}}public int absCompareTo(Fraction that) {Fraction thisone = this.abs();Fraction thatone = that.abs();if(thisone.isNaN()) {thisone = Fraction.ZERO;}if(thatone.isNaN()) {thatone = Fraction.ZERO;}if(thisone.isZero() && thatone.isZero()) {return 0;}else if(thisone.isInfinite() && thatone.isInfinite()) {return 0;}else {if( (thisone.numerator.multiply(thatone.denominator)).compareTo(thatone.numerator.multiply(thisone.denominator)) == 1) {return 1;}else if ( (thisone.numerator.multiply(thatone.denominator)).compareTo(thatone.numerator.multiply(thisone.denominator)) == 0 ) {return 0;}else return -1;}}public int compareTo(Fraction that) {    //实现接口函数if(this.sign == 1 && that.sign == -1 || this.sign == 1 && that.sign == 0) {return 1;}else if(this.sign == -1 && that.sign == 1 || this.sign == 0 && that.sign == 1) {return -1;}else if(this.sign == 1 && that.sign == 1) {return this.absCompareTo(that);}else if(this.sign == -1 && that.sign == -1) {return 0-this.absCompareTo(that);}else {    //this.sign == that.sign == 0return 0;}}private Fraction positiveAdd(Fraction that) {if(this.isInfinite() || that.isInfinite()) {return Fraction.POSITIVE_INFINITY;}else if(this.isZero()) {return that;}else if(that.isZero()) {return this;}else {Fraction frac = new Fraction(1,1);frac.numerator = this.numerator.multiply(that.denominator).add(that.numerator.multiply(this.denominator));frac.denominator = this.denominator.multiply(that.denominator);BigInteger common = frac.numerator.gcd(frac.denominator);frac.numerator = frac.numerator.divide(common);frac.denominator =frac.denominator.divide(common);return frac;}}private Fraction positiveSubtract(Fraction smaller) {if(this.isZero()) {smaller.sign = 0 - smaller.sign;return smaller;}else if(smaller.isZero()) {return this;}else if(this.isInfinite() && smaller.isInfinite()) {return Fraction.ZERO;}else if(this.isInfinite()) {return Fraction.POSITIVE_INFINITY;}else if(smaller.isInfinite()) {return Fraction.NEGATIVE_INFINITY;}else {Fraction frac = new Fraction(1,1);frac.numerator = this.numerator.multiply(smaller.denominator).subtract(smaller.numerator.multiply(this.denominator));if(frac.numerator.compareTo(BigInteger.ZERO)==-1) {frac.sign = -1;}else if(frac.numerator.compareTo(BigInteger.ZERO)==0) {return Fraction.ZERO;}frac.denominator = this.denominator.multiply(smaller.denominator);BigInteger common = frac.numerator.gcd(frac.denominator);frac.numerator = frac.numerator.divide(common);frac.denominator =frac.denominator.divide(common);return frac;}}public Fraction add(Fraction that) {if(this.isInfinite() || that.isInfinite()) {if(this.isInfinite() && that.isInfinite()) {if(this.sign == 1 && that.sign == 1) {return Fraction.POSITIVE_INFINITY;}else if(this.sign == -1 && that.sign == -1) {return Fraction.NEGATIVE_INFINITY;}else {return Fraction.ZERO;}}else if(this.isInfinite()) {return this;}else return that;}else if(this.isZero() || that.isZero()) {if(this.isZero()) {return that;}else {return this;}}else {Fraction frac = new Fraction(1,1);Integer thisISign = this.sign;String thisSSign = thisISign.toString();BigInteger thisBSign = new BigInteger(thisSSign);Integer thatISign = that.sign;String thatSSign = thatISign.toString();BigInteger thatBSign = new BigInteger(thatSSign);frac.numerator = thisBSign.multiply(this.numerator.multiply(that.denominator)).add(thatBSign.multiply(that.numerator.multiply(this.denominator)));if(frac.numerator.compareTo(BigInteger.ZERO)==-1) {frac.sign = -1;frac.numerator = frac.numerator.abs();}else if(frac.numerator.compareTo(BigInteger.ZERO)==0) {return Fraction.ZERO;}frac.denominator = this.denominator.multiply(that.denominator);BigInteger common = frac.numerator.gcd(frac.denominator);frac.numerator = frac.numerator.divide(common);frac.denominator =frac.denominator.divide(common);return frac;}}public Fraction subtract(Fraction that) {if(this.isInfinite() || that.isInfinite()) {if(this.isInfinite() && that.isInfinite()) {if(this.sign == 1 && that.sign == 1) {return Fraction.ZERO;}else if(this.sign == -1 && that.sign == -1) {return Fraction.ZERO;}else if(this.sign == 1 && that.sign == -1){return Fraction.POSITIVE_INFINITY;}else return Fraction.NEGATIVE_INFINITY;}else if(this.isInfinite()) {return this;}else {that.sign = 0 - that.sign;return that;}}else if(this.isZero() || that.isZero()) {if(this.isZero()) {return that;}else {return this;}}else {Fraction frac = new Fraction(1,1);Integer thisISign = this.sign;String thisSSign = thisISign.toString();BigInteger thisBSign = new BigInteger(thisSSign);Integer thatISign = that.sign;String thatSSign = thatISign.toString();BigInteger thatBSign = new BigInteger(thatSSign);frac.numerator = thisBSign.multiply(this.numerator.multiply(that.denominator)).subtract(thisBSign.multiply(that.numerator.multiply(this.denominator)));if(frac.numerator.compareTo(BigInteger.ZERO)==-1) {frac.sign = -1;frac.numerator = frac.numerator.abs();}else if(frac.numerator.compareTo(BigInteger.ZERO)==0) {return Fraction.ZERO;}frac.denominator = this.denominator.multiply(that.denominator);BigInteger common = frac.numerator.gcd(frac.denominator);frac.numerator = frac.numerator.divide(common);frac.denominator =frac.denominator.divide(common);return frac;}}public Fraction multiply(Fraction factor) {if(this.isZero() || factor.isZero()) {return Fraction.ZERO;}else if(this.isInfinite() || factor.isInfinite() ) {if(this.sign == factor.sign) {return Fraction.POSITIVE_INFINITY;}else return Fraction.NEGATIVE_INFINITY;}else {Fraction frac = new Fraction(1,1);frac.numerator = this.numerator.multiply(factor.numerator);if(this.sign != factor.sign) {frac.sign = -1;}frac.denominator = this.denominator.multiply(factor.denominator);BigInteger common = frac.numerator.gcd(frac.denominator);frac.numerator = frac.numerator.divide(common);frac.denominator =frac.denominator.divide(common);return frac;}}public Fraction multiply(long ratio) {if(this.sign == 0) return Fraction.ZERO;if(ratio == 0) {return Fraction.ZERO;}else if(ratio < 0) {this.sign = 0-this.sign;Long lRatio = 0-ratio;String sRatio = lRatio.toString();BigInteger bRatio = new BigInteger(sRatio);this.numerator = this.numerator.multiply(bRatio);BigInteger common = this.numerator.gcd(this.denominator);this.numerator = this.numerator.divide(common);this.denominator = this.denominator.divide(common);}else {Long lRatio = ratio;String sRatio = lRatio.toString();BigInteger bRatio = new BigInteger(sRatio);this.numerator = this.numerator.multiply(bRatio);BigInteger common = this.numerator.gcd(this.denominator);this.numerator = this.numerator.divide(common);this.denominator = this.denominator.divide(common);}return this;}public Fraction divide(Fraction divisor) {divisor = divisor.reciprocal();return this.multiply(divisor);}public Fraction divide(long ratio) {if(this.sign == 0) return Fraction.ZERO;if(ratio == 0) {if(this.sign == 1) return Fraction.POSITIVE_INFINITY;else return Fraction.NEGATIVE_INFINITY;}else if(ratio < 0) {this.sign = 0-this.sign;Long lRatio = 0-ratio;String sRatio = lRatio.toString();BigInteger bRatio = new BigInteger(sRatio);this.denominator = this.denominator.multiply(bRatio);BigInteger common = this.numerator.gcd(this.denominator);this.numerator = this.numerator.divide(common);this.denominator = this.denominator.divide(common);}else {Long lRatio = ratio;String sRatio = lRatio.toString();BigInteger bRatio = new BigInteger(sRatio);this.denominator = this.denominator.multiply(bRatio);BigInteger common = this.numerator.gcd(this.denominator);this.numerator = this.numerator.divide(common);this.denominator = this.denominator.divide(common);}return this;}public static void testSimple() {Fraction sum = ZERO;for (int i=1; i<=100; i++) {int denominator = i * (i+1);Fraction addend = new Fraction(1, denominator);sum = sum.add(addend);}System.out.println(sum);}public static void testComplex() {java.util.ArrayList<Fraction> al = new java.util.ArrayList<Fraction>();int quantity = 2022;for (int i=1; i<=quantity; i++) {int denominator = i * (i+1);Fraction addend = new Fraction(1, denominator);al.add(addend);}for (int i=1; i<=quantity-1; i+=2) {int denominator = i * (i+2);Fraction addend = new Fraction(1, denominator);al.add(addend.opposite());}int size = al.size();Fraction[] fractions = new Fraction[size];al.toArray(fractions);for (int i=0; i<size; i++) {int pos = (int)(Math.random() * size);Fraction temp = fractions[i];fractions[i] = fractions[pos];fractions[pos] = temp;}Fraction sum = Fraction.ZERO;for (int i=0; i<size; i++)sum = sum.add(fractions[i]);System.out.println(sum);
}public static void main(String[] args) {testComplex();}

}
输出结果

好了分享到此,不足之处,欢迎留言指正。

Java实现一个分数类相关推荐

  1. 用Java编写约分最简公式_一个有趣的算法问题:如何定义一个分数类

    一个来自于C++程序设计的经典问题.如何定义一个分数类,实现分数的约分化简,分数之间的加法.减法.乘法.除法四则运算? 1.初见 刚看到这道题的时候,第一感觉是挺简单的啊,就是基本的面向对象,定义对应 ...

  2. 一个有趣的算法问题:如何定义一个分数类

    一个来自于C++程序设计的经典问题.如何定义一个分数类,实现分数的约分化简,分数之间的加法.减法.乘法.除法四则运算? 1.初见 刚看到这道题的时候,第一感觉是挺简单的啊,就是基本的面向对象,定义对应 ...

  3. java修车_JAVA小练习34——使用java描述一个车类与一个修车厂类

    练习:使用java描述一个车类与一个修车厂类, 车具备的公共属性: 名字. 颜色. 轮子数. 车具备的公共 行为是跑的功能,但是跑之前必须要先检查轮子 是否够4个,如果不够4个轮子送去修车厂修理.修理 ...

  4. java订单类_基于Java创建一个订单类代码实例

    这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求描述 定义一个类,描述订单信息 订单id 订 ...

  5. java订单类_使用Java创建一个订单类代码实例

    这篇文章主要简介了使用Java创建一个订单类代码实例,文中通过示例代码简介的非常具体,对大家的学习或者工作具有一定的参考学习网上卖,需要的朋友可以学习下 需求描述 定义一个类,描述订单信息 订单id ...

  6. java设计一个user类_关于JAVA设计一个用户类

    关于JAVA设计一个用户类 关注:152  答案:2  mip版 解决时间 2021-02-02 05:51 提问者安分守己的小青春 2021-02-02 02:23 设计一个用户类,该类有用户编号. ...

  7. C++学习记录8:定义一个分数类Score和学生类Student

    (1)定义一个分数类Score.它有3个数据成员: Chinese       //语文课成绩 English       //英语课成绩 Mathematics   //数学课成绩 2个构造函数:无 ...

  8. python定义一个复数类complex、并实现复数相加_用java定义一个复数类Complex,能够创建复数对象,并且实现复数之间的加、减运算...

    题目: 用java定义一个复数类Complex,能够创建复数对象,并且实现复数之间的加.减运算 复数具有实部和虚部两部分,如2+5i就是一个复数,其中2为实部,5i为虚部;两复数相加时,实部与实部相加 ...

  9. java 员工类算工资_用java设计一个员工类,可以计算工资个人所得税

    用java设计一个员工类,可以计算工资个人所得税 1. 背景 老师在课上布置了几道java编程题,此为其中之一 2. 题目内容 设计一个员工类.该员工具有下列私有属性:编号,姓名,基本工资,奖金  提 ...

最新文章

  1. element table多选只能选中当前页数据_element-ui里的el-table 前端分页
  2. 英国首相将授权华为接入英国5G网络
  3. 小猿圈Python之实现京东秒杀功能代码
  4. ITK:将静态密集2D级别集可视化为高程图
  5. 这个夜晚的安宁与忧伤
  6. python xlrd课程_python中xlrd模块的使用详解
  7. 笔记本 win11 64位专业版iso文件v2021.07
  8. linux循环处理脚本命令,后端开发必须掌握的Linux命令[Shell脚本篇]
  9. Mac开发环境搭建_zsh替换bash_2
  10. 微擎模块安装文件manifest.xml
  11. 数字图像处理-冈萨雷斯(学习笔记)
  12. javamail课设_JavaMail简易教程
  13. Ubuntu系统搜狗拼音无法输出
  14. 什么是数据库的实体关系图(ERD)?
  15. 用c语言把图像转成jpg格式,图像格式转换之BMP格式转换为JPG格式(示例代码)
  16. php 计算今天周几,php如何计算当前日期是周几
  17. 2017-4-6 四月生花,冷暖自知
  18. 如何使用Python itchat库玩转微信, 统计好友信息, 设置自动回复和发送本地文件...
  19. python的try语句
  20. UserWarning: Glyph 30005 (\N{CJK UNIFIED IDEOGRAPH-7535}) missing from current font解决方式方法

热门文章

  1. mysql trunc函数_教您使用SQL中的TRUNC函数
  2. DDOS攻击压力测试与防御工具
  3. ReavtNative踩坑笔记(一)
  4. 华为android下载地址,解决Android 华为推送库下载不了
  5. 0基础学习VR全景平台篇第27章:场景管理-视角功能
  6. 爱奇艺抢跑影视工业化 继续“押注”好内容
  7. linux图形化时间工具,Linux下dialog图形化工具详解
  8. 800A开口电流互感器(安科瑞-卓宋兰)
  9. Adobe Acrobat Pro DC 2018
  10. 语音识别基本概念 II