1. 程式人生 > >用java實現分數各種運算(加減乘除,求餘,求冪,求兩個數中的較大值,較小值)

用java實現分數各種運算(加減乘除,求餘,求冪,求兩個數中的較大值,較小值)

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);				
		}
	}
}