2014-11-24 49 views
0

嗨我是新来的java和我在分数计算器上工作,我无法弄清楚如何让计算器减少简单分数和添加混合分数。 示例: 缩减:1/2 + -5/6 = -1/3
混合分数:4_15/16 + -3_11/16 = 1_1/4 编辑:对于混合分数,我尝试从分子中减去num> den的分母以获取整个和剩余部分,并将其返回并打印出来,但不打印任何内容。馏分计算器添加

import java.util.Scanner; 

public class Fraction { 
public static void main(String[] args) { 
    System.out.println("Enter an Expression or quit:"); 
    Scanner input = new Scanner(System.in); 
    String text = input.nextLine(); 
    while (!text.equals("quit")){ 
    String frac1 = text.substring(0,text.indexOf(" ")); 
    String oper = text.substring((text.indexOf(" "))+1,(text.indexOf(" "))+2); 
    String frac2 = text.substring((text.indexOf(" "))+3); 
    int fn1 = num(frac1); //frac1 numerator 
    int fd1 = den(frac1); //frac1 denominator 
    int fn2 = num(frac2); //frac2 numerator 
    int fd2 = den(frac2); //frac2 denominator 
    if (oper.equals("+")){ 
     int sumfinalnum = add(fn1, fd1, fn2, fd2); 
     if (fd1 == 1 && fd2 == 1){ 
      System.out.println(sumfinalnum); 
      } 
     else if ((fn1 + fn2)==0){ 
      System.out.println("0"); 
     } 
     else if (fd1 == fd2){ 
      if (sumfinalnum>fd1){ 
        System.out.println(extractWholePart(sumfinalnum,fd1)+"_"+extractNumPart(sumfinalnum,fd1)+"/"+fd1); 
      } 
      else{ 
     System.out.println(sumfinalnum+"/"+fd1); 
     } 
     } 
     else if (!(fd1 == fd2)){ 
     System.out.println(sumfinalnum+"/"+(fd1*fd2)); 
     } 
     System.out.println("Enter an Expression or quit:"); 
     text = input.nextLine(); 
     } 
    } 
    } 

public static int num(String input){ 
    if (input.contains("_")){ //mixed to improper 
     String a = input.substring(0,input.indexOf("_")); 
     String b = input.substring((input.indexOf("_"))+1,input.indexOf("/")); 
     String c = input.substring((input.indexOf("/"))+1); 
     int a1 = Integer.parseInt(a); 
     int b1 = Integer.parseInt(b); 
     int c1 = Integer.parseInt(c); 
     int d = a1*c1; 
     int e = d+b1; 
     return e;   
    } 
    else if (!input.contains("/")){ 
     int input1 = Integer.parseInt(input); 
     return input1; 
    } 
    else { 
    String strnum1 = input.substring(0,input.indexOf("/")); 
    int num1 = Integer.parseInt(strnum1); 
    return num1; 
    } 
} 
public static int den(String input){ 
    if(!input.contains("/")) {  //whole 
     return 1; 
    } 
    String strnum2 = input.substring((input.indexOf("/"))+1); 
    int num2 = Integer.parseInt(strnum2); 
    return num2; 

} 

public static int add(int fn1,int fd1,int fn2,int fd2){ 
    if (fd1 == fd2){ //matching denominator 
     int numadd = fn1 + fn2; 
     return numadd; 
    } 
    else if (fd1 == 1 && fd2 == 1){ //whole numbers no denom 
     int sum = fn1 + fn2; 
     return sum; 
    } 
    else if (!(fd1 == fd2)){ //different denominator*** 
     int dencomadd = fd1*fd2; 
     int gcd1 = dencomadd/fd1; 
     int gcd2 = dencomadd/fd2; 
     int comf1num = fn1*gcd1; 
     int comf2num = fn2*gcd2; 
     int total = comf1num+comf2num; 
     return total; 
    } 
    else{ 
     return 0; 

    } 


} 
public static int extractWholePart(int finalnum, int finalden){ 
    int whole = 0; 
    while (finalnum > finalden){ 
     whole++; 
    } 
    return whole; 
} 
public static int extractNumPart(int finalnum, int finalden){ 
    while (finalnum > finalden){ 
     finalnum -= finalden; 
    } 
    return finalnum; 
} 
} 
+0

为了减少一小部分:如果结果是A/B,则找到G ='的Math.abs最大公约数(A)'和B.然后减少除以A和B的分数。所以如果A = -4和B = 12,G将是4,然后你将A和B除以4得到-1/3。如果您不知道如何找到最大公约数,请在维基百科中查找“欧几里德算法”。 – ajb 2014-11-24 23:00:03

回答

0

让我们开始 - 这是java的,不要怕使用较大的变量名。 fn1很可能被称为fraction1Numerator

接下来,有一个方法来做它设计的目的。有一个add方法需要其他四个 - 如果在main不是一个好主意。

创建一个对象Fraction,将有成员变量numeratordenominator将使您add函数返回一个完整的答案。毕竟你有代码添加看起来不错的混合分数。

class Fraction{ 
    public int whole; 
    public int numerator; 
    public int denominator; 
} 

我还在简化后加了“整”来表示整个部分。 add功能会比有特色

public static Fraction add(Fraction fraction1, Fraction fraction2) ... 

提取完整的数字很简单 - 减去分子分母,直到你不能再这样了。在另一方面

public void extractWholePart(Fraction fraction){ 
    int whole = 0; 
    while (fraction.numerator > fraction.denominator){ 
     whole++; 
     fraction.numerator -= fraction.denominator; 
    } 
    fraction.whole = whole; 
} 

简化只是将两个提名和分母的最大公约数 - algorythm计算是在互联网上很容易玛丽萨。

0

尝试是这样的

float mixedToDecimal(String data) 
// data would be like this "1 5/8"; 
String[] parts = data.split(" "); 
if(!(parts.lenght > 0)) // this mean that if data is NOT mixedfraction then just return -1 
    return -1; 
float value = Integer.parseInt(parts[0]); 
if (parts.length > 1) { 
    // has fractional part 
    parts = parts[1].split("/"); 
    float numerator = Integer.parseInt(parts[0]); 
    float denominator = Integer.parseInt(parts[1]); 
    value += numerator/denominator; 
} 
// value contains 1.625 
return value; 
+0

我很难以小数形式返回它,如果它包含整数,则需要有下划线。 – Jenny 2014-11-25 05:51:14

+0

回答更新请看看。 – Junaid 2014-11-25 05:59:03