Java实现一个分数类

该博客介绍了如何使用Java编写一个分数类,包括分数的构造、约分、整数转换、基本运算(加、减、乘、除、倒数、相反数)。类中还包含了特殊值(正无穷、负无穷、NaN)的处理,并提供了比较操作。通过测试用例展示了类的功能。
摘要由CSDN通过智能技术生成

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;	//NAN
	s += 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 == 0
		return 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();
	
}

}
在这里插入图片描述输出结果

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

可以通过在代码中添加一个判断语句,来实现在状态相同的情况下将分数变为红色。例如: ``` <div>正确答案:</div> <% result.forEach(function(item){ %> <tr> <td>源地址:<%= item.source %></td> <td>源区域:<%= item.area %></td> <td>目标地址:<%= item.target %></td> <td>目标区域:<%= item.tarea %></td> <td>服务:<%= item.serv %></td> <td>日期:<%= item.time %></td> <td>动作:<%= item.action %></td> <td>状态:<%= item.state %></td> </tr> <br> <% student.forEach(function(ites){ %> <br> <div>您的答案:</div> <tr> <td>源地址:<%= ites.source %></td> <td>源区域:<%= ites.area %></td> <td>目标地址:<%= ites.target %></td> <td>目标区域:<%= ites.tarea %></td> <td>服务:<%= ites.serv %></td> <td>日期:<%= ites.time %></td> <td>动作:<%= ites.action %></td> <td>状态:<%= ites.state %></td> </tr> <% var fraction = 0; %> <% if(item.source==ites.source) fraction+=10; %> <% if(item.area==ites.area) fraction+=10; %> <% if(item.target==ites.target) fraction+=10; %> <% if(item.tarea==ites.tarea) fraction+=10; %> <% if(item.serv==ites.serv) fraction+=10; %> <% if(item.time==ites.time) fraction+=10; %> <% if(item.action==ites.action) fraction+=20; %> <% if(item.state==ites.state) { %> <% fraction+=20; %> <% if(item.state==ites.state && item.state==stat){ %> <% fraction= '<span style="color:red;">'+fraction+'</span>'; %> <% } %> <% } %> <br><br> 恭喜您,您的分数为: <%= fraction %> <% }) %> <% }) %> ``` 这里使用了嵌套的判断语句,如果item.state==ites.state 且 item.state==stat,则将 fraction 变量的值用 <span> 标签包裹,并设置颜色为红色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wucunqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值