用java實現分數各種運算(加減乘除,求餘,求冪,求兩個數中的較大值,較小值)
阿新 • • 發佈:2019-01-06
package Rational; import java.util.StringTokenizer; /** * @author SunKun * 分數四則運算 */ public class Calculator { int numerator; // 分子 int denominator; // 分母 Calculator(){ } Calculator(int a,int b){ if(a == 0){ numerator = 0; denominator = 1; } else{ setNumeratorAndDenominator(a,b); } } void setNumeratorAndDenominator(int a, int b){ // 設定分子和分母 int c = f(Math.abs(a),Math.abs(b)); // 計算最大公約數 numerator = a / c; denominator = b / c; if(numerator<0 && denominator<0){ numerator = - numerator; denominator = - denominator; } } int getNumerator(){ return numerator; } int getDenominator(){ return denominator; } int f(int a,int b){ // 求a和b的最大公約數 if(a < b){ int c = a; a = b; b = c; } int r = a % b; while(r != 0){ a = b; b = r;; r = a % b; } return b; } Calculator add(Calculator r){ // 加法運算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b + denominator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator sub(Calculator r){ // 減法運算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b - denominator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator muti(Calculator r){ // 乘法運算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * a; int newDenominator = denominator * b; Calculator result = new Calculator(newNumerator,newDenominator); return result; } Calculator div(Calculator r){ // 除法運算 int a = r.getNumerator(); int b = r.getDenominator(); int newNumerator = numerator * b; int newDenominator = denominator * a; Calculator result = new Calculator(newNumerator,newDenominator); return result; } static Calculator qiuyu(double left,double right){ // 求餘運算 double point_result = Math.IEEEremainder(left, right); int r1 = (int)point_result; double r2 = point_result - r1; int newNumerator = r1*10000 + (int)(r2*10000); int newDenominator = 10000; Calculator result = new Calculator(newNumerator,newDenominator); return result; } static Calculator pow(double left,double right){ // 求冪運算left^right double point_result = Math.pow(left, right); int r1 = (int)point_result; double r2 = point_result - r1; int newNumerator = r1*10000 + (int)(r2*10000); int newDenominator = 10000; Calculator result = new Calculator(newNumerator,newDenominator); return result; } static Calculator max(double left,double right){ // 求兩數中的較大值 double point_result = Math.min(left, right); int r1 = (int)point_result; double r2 = point_result - r1; int newNumerator = r1*10000 + (int)(r2*10000); int newDenominator = 10000; Calculator result = new Calculator(newNumerator,newDenominator); return result; } static Calculator min(double left,double right){ // 求兩數中的較小值 double point_result = Math.min(left, right); int r1 = (int)point_result; double r2 = point_result - r1; int newNumerator = r1*10000 + (int)(r2*10000); int newDenominator = 10000; Calculator result = new Calculator(newNumerator,newDenominator); return result; } // 封裝了具體運算,主要為對輸入進行轉換,對輸出封裝 public static void compute(String data1,String operation,String data2){ StringTokenizer fenxi = new StringTokenizer(data1,"/"); int data1_1 = Integer.parseInt(fenxi.nextToken()); int data1_2 = Integer.parseInt(fenxi.nextToken()); fenxi = new StringTokenizer(data2,"/"); int data2_1 = Integer.parseInt(fenxi.nextToken()); int data2_2 = Integer.parseInt(fenxi.nextToken()); Calculator r1 = new Calculator(data1_1,data1_2); Calculator r2 = new Calculator(data2_1,data2_2); Calculator result; int a,b; if(operation.equals("+")){ // 兩數相加 result = r1.add(r2); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } if(operation.equals("-")){ // 兩數相減 result = r1.sub(r2); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } if(operation.equals("*")){ // 兩數相乘 result = r1.muti(r2); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } if(operation.equals("/")){ // 兩數相除 result = r1.div(r2); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } if(operation.equals("%")){ // 兩數求餘 double left = (double)data1_1/(double)data1_2; double right = (double)data2_1/(double)data2_2; result = qiuyu(left,right); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } if(operation.equals("^")){ // 兩數求冪 double left = (double)data1_1/(double)data1_2; double right = (double)data2_1/(double)data2_2; result = pow(left,right); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } if(operation.equals("max")){ // 兩數中的較大值 double left = (double)data1_1/(double)data1_2; double right = (double)data2_1/(double)data2_2; result = max(left,right); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } if(operation.equals("min")){ // 兩數中的較小值 double left = (double)data1_1/(double)data1_2; double right = (double)data2_1/(double)data2_2; result = min(left,right); a = result.getNumerator(); b = result.getDenominator(); System.out.println(data1+" "+operation+" " +data2+" = " + a + "/" + b); } } }