Как использовать дробь в java

В настоящее время я делаю программу с кучей методов. В этом методе речь идет о дробях. Предполагается, что пользователь должен ввести целочисленный числитель и знаменатель, например, 9/5 (не с десятичными знаками, такими как 3,2/1,4).

После того, как метод выполнил свою работу, он должен вернуть результат основному методу, в данном случае 1_4/5. Проблема, с которой я сталкиваюсь, заключается в том, что ответ должен быть возвращен в виде строки. Не могу заставить его работать. Если возвращаемое целое или дробное число равно 0, его также следует обрабатывать «более приятным способом».

Не совсем понял, но вот небольшой код, который я придумал до сих пор. Может быть, так проще понять проблему. Заранее спасибо!

public static String fraction(int numerator, int denominator){
        fractionQuota = numerator / denominator;
        fractionRest = numerator % denominator;
        return fractionQuota;

person William Nyqvister    schedule 10.12.2015    source источник
comment
Сделайте несколько примеров для ввода и того, что вы ожидаете вернуть.   -  person Thorbjørn Ravn Andersen    schedule 11.12.2015
comment
Подумайте о вариантах, которые у вас есть, чтобы получить компоненты ответа. Например, целочисленное деление даст вам 1 в вашем примере. Как вы можете получить остаток?   -  person ChiefTwoPencils    schedule 11.12.2015
comment
Вы знаете, что вам нужно будет иметь возможность умножить ваши числа, чтобы упростить ваши дроби, верно? Кроме того, вы можете взять числитель и посмотреть, сколько раз в него входит знаменатель. Затем составь смешанную дробь и упрости ее.   -  person WIR3D    schedule 11.12.2015
comment
Кроме того, что вы имеете в виду, если возвращаемое целое или дробное число равно 0, его также следует обрабатывать более удобным способом. это произойдет только в том случае, если знаменатель равен 0. Вы можете просто проверить эти случаи   -  person WIR3D    schedule 11.12.2015
comment
@Fungucide, ожидаемый результат выглядит как 1_4/5. Зачем нужно упрощать дробь, если вы можете просто получить ее напрямую с помощью %, как в примере? System.out.println((9/5) + "_" + (9 % 5) + "/" + 5); кажется достаточно простым.   -  person ChiefTwoPencils    schedule 11.12.2015
comment
Правда, тогда я не вижу проблемы, с которой сталкивается Уильям Нюквистер. Это кажется довольно прямолинейным   -  person WIR3D    schedule 11.12.2015
comment
Я предполагаю, что все сводится к тому, чтобы превратить его в строку и, возможно, как сделать ее лучше, когда она будет иметь начальный 0. Но да, довольно прямолинейно. @Фунгуцид   -  person ChiefTwoPencils    schedule 11.12.2015


Ответы (1)


Примечание. Я сделал предположение, что и числитель, и знаменатель положительны, а знаменатель строго положителен. Код «работает», но отформатирован как -1_-4/5, что не очень приятно.

Во-первых, я думаю, вы хотите нормализовать свою дробь: уменьшить ее так, чтобы 21/15 сначала возвращалось к 7/5. Это можно сделать, сначала вычислив наибольший общий делитель. Я "позаимствовал" свой собственный метод:

private static int gcd(int a, int b) {
    int t;
    while(b != 0){
        t = a;
        a = b;
        b = t%b;
    }
    return a;
}

Теперь, когда у нас это есть, мы можем нормализовать дробь:

public static String fraction(int numerator, int denominator){
    int div = gcd(Math.abs(numerator),denominator);
    numerator /= div;
    denominator /= div;
    //TODO
    //...
}

Далее нам нужно найти интегральную часть, это можно сделать с помощью:

    int intPart = (numerator/denominator);

Далее мы можем вычислить оставшуюся часть с помощью:

    int remPart = numerator-intPart*denominator;

Наконец, мы используем String.format, чтобы объединить все это в String:

    return String.format("%d_%d/%d",intPart,remPart,denominator);

Итак, метод гласит:

public static String fraction(int numerator, int denominator){
    int div = gcd(Math.abs(numerator),denominator);
    numerator /= div;
    denominator /= div;
    int intPart = (numerator/denominator);
    int remPart = numerator-intPart*denominator;
    return String.format("%d_%d/%d",intPart,remPart,denominator);
}

Демо: вы можете использовать этот jDoodle.

person Willem Van Onsem    schedule 10.12.2015