Я пытаюсь сделать программу, которая принимает две фракции, а затем добавляет, вычитает, умножает и делит их, а затем ставит их в простейшей форме, если это необходимо.Устранение неполадок в java
Единственная проблема, с которой я столкнулся, заключается в том, что фракции не упрощаются, и я не уверен, почему.
Например, прямо сейчас, когда я бегу фракции 3/4 и 1/4 через это дает мне ответы на эти вопросы: Дополнение: 4/4 Вычитание: 2/4 Умножение: 3/16 Раздел: 12/4
Я хочу, чтобы дополнение было 1/1, вычитание 1/2 и деление 3/1. Ниже мой код.
import java.util.*;
public class RationalNumber
{
private int numerator;
private int denominator;//instance variables
//constructor
public RationalNumber()
{
numerator = 0;
denominator = 1;
}
public RationalNumber(int num, int den)
{
setNumerator(num);
setDenominator(den);
int gcf= greatestCommonFactor(num, den);
num = num/gcf;
den = den/gcf;
/*num = num/(greatestCommonFactor(num, den));
den = den/(greatestCommonFactor(num, den));*/
}
//getters
public int getDenominator()
{
return denominator;
}
public int getNumerator()
{
return numerator;
}
//setters
public void setNumerator(int num)
{
numerator = num;
}
public void setDenominator(int den)
{
denominator = den;
}
//adds the rational numbers
public RationalNumber add(RationalNumber two)
{
RationalNumber add = new RationalNumber();
if(getDenominator() == two.getDenominator())
{
int newNum = numerator + two.numerator;//simply adds the numerators if the denominators are the same
/*newNum = newNum/(greatestCommonFactor(newNum, denominator));
int newDen = denominator/(greatestCommonFactor(newNum, denominator));//simplification*/
return new RationalNumber(newNum, denominator);
}
else
{
int newDen = getDenominator() * two.getDenominator();
int leftNum = getNumerator() * two.getDenominator();
int rightNum = getDenominator() * two.getNumerator();//cross multiplication
/*int newNum = (leftNum + rightNum)/(greatestCommonFactor((leftNum + rightNum), getDenominator()));//simplification
newDen = denominator/(greatestCommonFactor(newNum, getDenominator()));*/
return new RationalNumber(leftNum + rightNum, newDen);
}
}
//subtracts the rational numbers, same math as the add method but with subtraction signs
public RationalNumber sub(RationalNumber two)
{
RationalNumber sub = new RationalNumber();
if(this.getDenominator() == two.getDenominator())
{
int newNum = this.numerator - two.numerator;
return new RationalNumber(newNum, this.getDenominator());
}
else
{
int newDen = this.getDenominator() * two.getDenominator();
int leftNum = this.getNumerator() * two.getDenominator();
int rightNum = this.getDenominator() * two.getNumerator();
return new RationalNumber(leftNum - rightNum, newDen);
}
}
//multiplies the two rational numbers
public RationalNumber mult(RationalNumber two)
{
RationalNumber mult = new RationalNumber();
mult.denominator = denominator * two.denominator;
mult.numerator = numerator * two.numerator;
return mult;
}
//divides the rational numbers
public RationalNumber div(RationalNumber two)
{
RationalNumber div = new RationalNumber();
div.denominator = denominator * (two.numerator);
div.numerator = numerator * two.denominator;//multiply by reciprocal in order to divide
return div;
}
//returns the reciprocal of a rational number
public RationalNumber reciprocal(RationalNumber two)
{
RationalNumber reciprocal = new RationalNumber();
reciprocal.denominator = numerator;
reciprocal.numerator = denominator;
return reciprocal;
}
//returns the inverse of a rational number
public RationalNumber inverse(RationalNumber two)
{
RationalNumber inverse = new RationalNumber();
inverse.numerator = (numerator*-1);
return inverse;
}
//finds the greatest common factor, used in simplifying
public int greatestCommonFactor(int num, int den)
{
for(int i = (Math.max(num,den)/2)+1; i > 0; i--)
{
if((num/i) == Math.round(num/i) && (den/i) == Math.round(den/i))
return i;//loop finds the GCF by finding if numerator & denominator divided by i is an even number
}
return 1;
}
public String toString()
{
return numerator + "/" + denominator;//prints the numerator and denominator as a string
}
}
Помимо: Вы, вероятно, не хотят, чтобы сделать 'setNumerator' и' setDenominator' public, потому что есть проблема, определяющая, как они должны работать. В настоящее время эти методы не оставляют число в простейшей форме. Но предположим, вы исправите его, чтобы он его уменьшил. Тогда что это делать? 'r = новый RationalNumber (5, 6); r.setNumerator (3); r.setDenominator (4); 'Это не приведет к 3/4, потому что' setNumerator' установит его на 3/6 и уменьшит его до 1/2, тогда 'setDenominator' установит его в 1/4. Вам может понадобиться метод, который позволяет * устанавливать оба *, но не каждый отдельно. – ajb