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();
}
}
输出结果
好了分享到此,不足之处,欢迎留言指正。
该博客介绍了如何使用Java编写一个分数类,包括分数的构造、约分、整数转换、基本运算(加、减、乘、除、倒数、相反数)。类中还包含了特殊值(正无穷、负无穷、NaN)的处理,并提供了比较操作。通过测试用例展示了类的功能。

503

被折叠的 条评论
为什么被折叠?



