2015-10-28 4 views
0

У меня есть проект фракционного калькулятора, в котором я пытаюсь. Я выяснил, как делать все с точки зрения операций, но я все еще изо всех сил пытаюсь исправить ответы на фракции, которые мне дает мой код. Я имею представление о том, что мне нужно сделать с точки зрения евклидова алгоритма, но для этого мне нужно иметь два целых числа. Я знаю, что такое целые числа, но я не могу их изолировать, чтобы подключиться к методу с двумя целыми числами, а затем распечатать их как дробную.Нужна помощь, разделяющая отдельные целые числа с долей

Мой главный класс:

package fracCalc; 

    import java.util.Scanner; 

    // @KashyapGarimella 
    // Period 2 
    // CP 3 
    // FracCalc 
    public class FracCalc { 

     public static void main(String[] args) { 
      Scanner console = new Scanner(System.in); 
      System.out.println("Input an equation: "); 
      String input = console.nextLine(); 
      while (!input.equals("quit")) { 
       System.out.println(produceAnswer(input)); 
       System.out.println("Input another equation: "); 
       input = console.nextLine(); 
       } 
      System.out.println("End."); 
      console.close(); 
     } 
     public static String produceAnswer(String input) { 
      Scanner token = new Scanner(input); 
      String operator_1 = token.next(); 
      String function = token.next(); 
      String operator_2 = token.next(); 
      token.close(); 
      Fraction fraction_1 = Fraction.Improper (parse(operator_1)); 
      Fraction fraction_2 = Fraction.Improper (parse(operator_2)); 
      Fraction answer = solveEquation(fraction_1, function, fraction_2); 
      return (answ 

er.Numerator + "/" + answer.Denominator); 
    } 
    public static Fraction parse(String input) { 
     Fraction fraction = new Fraction(); 
     if(input.indexOf("_")> 0){ 
      fraction.Integer = Integer.parseInt(input.substring(0, input.indexOf("_"))); 
      fraction.Numerator = Integer.parseInt(input.substring(input.indexOf("_") + 1, input.indexOf("/"))); 
      fraction.Denominator = Integer.parseInt(input.substring(input.indexOf("/") + 1)); 
     } 
     else if (input.indexOf("/") > 0) { 
      fraction.Numerator = Integer.parseInt(input.substring(0, input.indexOf("/"))); 
      fraction.Denominator = Integer.parseInt(input.substring(input.indexOf("/") + 1)); 
     } else { 
      fraction.Integer = Integer.parseInt (input); 

     } 
     return fraction; 
    } 
    public static Fraction solveEquation (Fraction fraction_1, String function, Fraction fraction_2){ 
     Fraction fraction = new Fraction(); 
     if (function.equals("+")){ 
      fraction.Numerator = fraction_1.Numerator * fraction_2.Denominator + fraction_1.Denominator * fraction_2.Numerator; 
      fraction.Denominator = fraction_1.Denominator * fraction_2.Denominator; 
     } 
     else if (function.equals("-")) { 
      fraction.Numerator = fraction_1.Numerator * fraction_2.Denominator - fraction_1.Denominator*fraction_2.Numerator; 
      fraction.Denominator = fraction_1.Denominator * fraction_2.Denominator; 
     } 
     else if (function.equals("*")) { 
      fraction.Numerator = fraction_1.Numerator * fraction_2.Numerator; 
      fraction.Denominator = fraction_1.Denominator * fraction_2.Denominator; 
     } 
     else if (function.equals("/")) { 
      fraction.Numerator = fraction_1.Numerator * fraction_2.Denominator; 
      fraction.Denominator = fraction_1.Denominator * fraction_2.Numerator; 
     } 

     return fraction; 
    } 

} 

Вот моя доля класса, где я намерен провести эвклидовский алгоритм.

package fracCalc; 

public class Fraction { 
    int Numerator = 0; 
    int Denominator = 1; 
    int Integer = 0; 


public static Fraction Improper(Fraction improper){ 
    Fraction fraction = new Fraction(); 
    fraction.Denominator = improper.Denominator; 
    if(improper.Integer < 0){ 
     fraction.Numerator = improper.Integer * improper.Denominator + (-1) * improper.Numerator; 
     } 
    else { 
    fraction.Numerator = improper.Integer * improper.Denominator + improper.Numerator; 
    } 
    return fraction; 
} 
} 
+0

Вы спрашиваете, как применить алгоритм эвцидиан к уменьшению фракций? – Soana

+0

Не совсем, я просто хотел выяснить, как отделить два целых числа, которые в настоящее время составляют мой дробный ответ, и подключить их к методу GCD, чтобы вернуть ответ типа фракции на мой метод productAnswer. –

ответ

0

Прежде всего, вы будете четко нужно рассчитать наибольший общий знаменатель (НОД) между числителем и знаменателем. Вы можете добиться этого следующим образом, где p - числитель, а q - знаменатель.

public static int getGCD(int p, int q) { 
    while (q != 0) { 
     int temp = q; 
     q = p % q; 
     p = temp; 
    } 
    return p; 
} 

Теперь, когда вы вычислили НОД, все, что вам тогда нужно сделать, это разделить числитель и знаменатель это число, тем самым давая вам наиболее восстановленную форму фракции.

Обновление: Возможно, ваш источник данныхAnswer является источником ошибки. Попробуйте сделать функцию, которая берет строку в качестве ввода и создает объект фракции, проверяя каждый символ в строке до тех пор, пока не будет найдено «/». На этом этапе вы можете выделить как числитель, так и знаменатель и назначить им этот объект фракции, который вы затем вернете.

Как только вы закончите, вы можете просто изменить функцию productAnswer, чтобы взять объект фракции и легко получить доступ к необходимым вам данным.

+0

Эй, Шейн. Спасибо за код, но как я могу отделить два целых числа, которые составляют числитель и знаменатель, чтобы получить ints p и q? Прямо сейчас они находятся в типе, который я назвал Fraction (класс), и я хочу, чтобы этот метод возвращал тип фракции моему методу productAnswer в моем основном коде. –

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