我正在试用一个小数计算器项目。我已经弄清楚如何在操作方面做所有事情,但我仍在努力减少我的代码给我的分数答案。我对欧几里得算法需要做的事情有所了解,但我需要有两个整数。我知道整数是什么,但是我不能将它们隔离成插入一个2整数的方法,然后将它们作为一个分数打印出来。
我的主要课程:
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;
}
}
这是我的Fraction类,我打算主持Euclidian算法。
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 :(得分:0)
首先,您显然需要计算分子和分母之间的最大公分母(GCD)。您可以按如下方式实现此目的,其中p是分子,q是分母。
public static int getGCD(int p, int q) {
while (q != 0) {
int temp = q;
q = p % q;
p = temp;
}
return p;
}
现在你计算了GCD,你需要做的就是将这个数字除以分子和分母,从而为你提供最简化的分数形式。
更新: 您的produceAnswer功能可能是您的错误的来源。尝试创建一个以字符串作为输入的函数,并通过检查字符串中的每个字符来创建一个分数对象,直到找到“/”。此时,您可以隔离分子和分母,并将它们分配给您将返回的此分数对象。
完成此操作后,您只需更改produceAnswer功能即可获取分数对象,并轻松访问所需的数据。