Проблема с формулой сложения дробей Java

У меня есть проект для класса, в котором вы должны получить две дроби от пользователя с разными знаменателями, сложить их вместе и вывести с наименьшим общим знаменателем. Поскольку мы должны использовать принципы только из рассмотренных нами глав, я не могу создать класс фракций, поэтому, пожалуйста, не предлагайте этого. В основном мне нужно сделать метод (ы), чтобы сложить дроби вместе. Я просто пытаюсь получить базовую формулу для методов, так что вот весь код, который у меня есть для этого прямо сейчас. Любые предложения, советы или помощь с благодарностью. :-)

//Joseph Biancardi
//IS1300 Spring 2015
public class FractionAddition{
public static void main(String[] args) {
    final int n1 = 2;
    final int n2 = 3;
    final int d1 = 3;
    final int d2 = 6;
    int c = 0;
    int e1 = 0;
    int e2 = 0;
    while(c == 0) {
        if(e1 == e2) {
            c = 2;
        }
        e1 =+ d1;
        if(e1 == e2) {
            c = 1;
        }
        e2 =+ d2;

    }
    System.out.println(e1 + " " + e2);
    int f1 = e1 / d1;
    int f2 = e2 / d2;
    int g1 = n1 * f1;
    int g2 = n2 * f2;
    int final1 = g1 + g2;
    System.out.println(n1 + " " + n2 + " equals" + " " + final1);
    System.out.println(d1 + " " + d2 + " equals" + " " + e1);
        }
    }

person Joe    schedule 05.05.2015    source источник
comment
какой у вас е1 и е2? для будущих ссылок, пожалуйста, используйте лучшие имена переменных и добавляйте комментарии   -  person jean    schedule 05.05.2015
comment
Извините, что нет комментариев. Я забыл... Но я использовал их только как быстрый способ вычислить всю математику.   -  person Joe    schedule 05.05.2015


Ответы (1)


Ваш способ найти LCM неверен. Вы должны вычислить e следующим образом:

private static long gcd(long a, long b)
{
    while (b > 0)
    {
        long temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}


private static long lcm(long a, long b)
{
    return a * (b / gcd(a, b));
}
...
e = lcm(d1, d2); //denominator
int f1 = e / d1;
int f2 = e / d2;
int g1 = n1 * f1;
int g2 = n2 * f2;
int final1 = g1 + g2;
int k = gcd(final1, e);
int final_nominator = final1 / k;
int final_denominator = e / k;

Обратите внимание, что мой алгоритм gcd не является оптимальным, его скорость может быть значительно улучшена.

person vojta    schedule 05.05.2015
comment
Вы имеете в виду, что его можно улучшить, удалив ненужный код или в самом процессе? - person Joe; 05.05.2015
comment
Большое спасибо за вашу помощь в этом. Я запутался с математикой lcd и gcd. Теперь я могу понять остальную часть моей программы. - person Joe; 05.05.2015
comment
Взгляните на mathblog.dk/gcd-faceoff. Есть и другие способы вычисления gcd. Мой не самый быстрый. - person vojta; 05.05.2015