2013-09-21 4 views
2

Я пытаюсь сделать программу, которая принимает две фракции, а затем добавляет, вычитает, умножает и делит их, а затем ставит их в простейшей форме, если это необходимо.Устранение неполадок в 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 
} 
} 
+0

Помимо: Вы, вероятно, не хотят, чтобы сделать 'setNumerator' и' setDenominator' public, потому что есть проблема, определяющая, как они должны работать. В настоящее время эти методы не оставляют число в простейшей форме. Но предположим, вы исправите его, чтобы он его уменьшил. Тогда что это делать? 'r = новый RationalNumber (5, 6); r.setNumerator (3); r.setDenominator (4); 'Это не приведет к 3/4, потому что' setNumerator' установит его на 3/6 и уменьшит его до 1/2, тогда 'setDenominator' установит его в 1/4. Вам может понадобиться метод, который позволяет * устанавливать оба *, но не каждый отдельно. – ajb

ответ

1

Ваша greatestCommonFactor функция давала мне неправильные результаты. Поэкспериментируйте с этим (это с помощью метода Евклида):

//finds the greatest common factor, used in simplifying 
public int greatestCommonFactor(int num, int den) 
{ 
    if(den == 0){ 
     return num; 
    } 
    return greatestCommonFactor(den, num % den); 
} 

Также вы не установите numerator или denominator к их упрощенной форме:

public RationalNumber(int num, int den) 
{ 
    //setNumerator(num); 
    //setDenominator(den); 
    int gcf= greatestCommonFactor(num, den); 
    setNumerator(num/gcf); 
    setDenominator(den/gcf); 
} 
+0

Просто прокомментировал старый метод greatCommonFactor и вставил его. Все еще давая мне тот же результат, что и старый. Я не уверен, что здесь не так. –

+0

Oh duh. Хорошо, позвольте мне проверить его на самом деле быстро с тем, что зафиксировано в конструкторе. –

+0

Хорошо, теперь это результат: Добавленные рациональные числа равны: 1/0 Рациональные вычитаемые числа равны: 1/1 Рациональные числа умножаются равными: 1/4 Рациональные числа, разделенные равными: 4/1 –

Смежные вопросы