Java語言實現分數的加減乘除


Java語言實現分數的加減乘除

Java:

import java.util.Scanner;

class Fraction{    // 分數類
	public int molecule, denominator;   // 分子, 分母
	public Fraction() {
		molecule = 1;
		denominator = 1;
	}
}

public class TestFive {
	private static Fraction a, b;   // 兩個分數
	static Scanner sc = new Scanner(System.in);
	
	// 最大公約數方法
	public static int greatestCommonDivisor(int a, int b) {     
		return (a % b == 0) ? b : greatestCommonDivisor(b, a%b); 
	}
	// 最小公倍數
	public static int leastCommonMultiple(int a, int b) {
		return a*b/greatestCommonDivisor(a, b);
	}
	
	// 加法
	public static Fraction add(Fraction a, Fraction b) {
		Fraction result = new Fraction();               // 計算結果
		// 通分並計算
		int denleacommul = leastCommonMultiple(a.denominator, b.denominator);   // 兩個分數的分母的最小公倍數
		int temp1 = denleacommul/a.denominator;         
		int temp2 = denleacommul/b.denominator;
		result.molecule = a.molecule*temp1 + b.molecule*temp2;        // 分子相加
		result.denominator = denleacommul;                            // 分母不變
		// 約分
		int moldengrecomdiv = greatestCommonDivisor(Math.abs(result.molecule), Math.abs(result.denominator));// 不考慮符號
		result.denominator /= moldengrecomdiv;
		result.molecule /= moldengrecomdiv;
		// 返回結果
		return result;
	}
	// 減法
	public static Fraction subtraction(Fraction a, Fraction b) {
		Fraction result = new Fraction();               // 計算結果
		// 通分並計算
		int denleacommul = leastCommonMultiple(a.denominator, b.denominator);   // 兩個分數的分母的最小公倍數
		int temp1 = denleacommul/a.denominator;         
		int temp2 = denleacommul/b.denominator;
		result.molecule = a.molecule*temp1 - b.molecule*temp2;        // 分子相減
		result.denominator = denleacommul;                            // 分母不變
		// 約分
		int moldengrecomdiv = greatestCommonDivisor(Math.abs(result.molecule), Math.abs(result.denominator));// 不考慮符號
		result.denominator /= moldengrecomdiv;
		result.molecule /= moldengrecomdiv;
		// 返回結果
		return result;
	}
	// 乘法
	public static Fraction multiplication(Fraction a, Fraction b) {
		Fraction result = new Fraction();               // 計算結果
		// 計算
		result.molecule = a.molecule*b.molecule;
		result.denominator = a.denominator*b.denominator;
		// 約分
		int moldengrecomdiv = greatestCommonDivisor(Math.abs(result.molecule), Math.abs(result.denominator));// 不考慮符號
		result.denominator /= moldengrecomdiv;
		result.molecule /= moldengrecomdiv;
		// 返回結果
		return result;
	}
	// 除法
	public static Fraction division(Fraction a, Fraction b) {
		Fraction result = new Fraction();               // 計算結果
		// 計算
		result.molecule = a.molecule*b.denominator;
		result.denominator = a.denominator*b.molecule;
		if(result.denominator < 0) {                    // 分母不為負的
			result.molecule = -result.molecule;
			result.denominator = -result.denominator;
		}
		// 約分
		int moldengrecomdiv = greatestCommonDivisor(Math.abs(result.molecule), Math.abs(result.denominator));// 不考慮符號
		result.denominator /= moldengrecomdiv;
		result.molecule /= moldengrecomdiv;
		// 返回結果
		return result;
	}
	
	// 讀取分子和分母
	public static void inputMolDen(Fraction a) {
		a.molecule = 0;
		a.denominator = 0;
		String inputfraction = sc.next();
		
/* * boolean flag = true; // 標記符號 * int count = -1; // count為負是讀分子,count為正時讀分母 * for(int i = 0;i < inputfraction.length();i++) { * if(inputfraction.charAt(i) == '-') // 如果分數是負的, flag 標記為 false * flag = false; * else if(Character.isDigit(inputfraction.charAt(i)) && count < 0){ * if(count != -1) * a.molecule *= 10; * count--; * a.molecule += Integer.valueOf(String.valueOf(inputfraction.charAt(i))); * }else if(inputfraction.charAt(i) == '/') { // 分子讀完, 變 count 為正, 讀分母 * count = 1; * }else if(count > 0){ * if(count != 1) * a.denominator *= 10; * count++; * a.denominator += Integer.valueOf(String.valueOf(inputfraction.charAt(i))); * } * } * // 處理符號 * if(flag == false) * a.molecule = -a.molecule; * * 以上注釋代碼也可以實現下面功能 */
		
		boolean flag = true;          // 標記符號
		int molstart = 0, molend = 0, i = 0;
		while(i < inputfraction.length()) {        // 找分子的開頭
			if(Character.isDigit(inputfraction.charAt(i))){
				molstart = i;
				break;
			}
			i++;
		}
		for(i =0;i < inputfraction.length();i++) {
			if(inputfraction.charAt(i) == '-')        // 如果分數是負的, flag 標記為 false
				flag = false;
			if(inputfraction.charAt(i) == '/') {
				molend = i;        // 分子的末尾 + 1
				break;
			}
		}
		a.molecule = Integer.parseInt(inputfraction.substring(molstart, molend));
		a.denominator = Integer.parseInt(inputfraction.substring(molend+1, inputfraction.length()));
		
		// 處理符號
		if(flag == false) 
			a.molecule = -a.molecule;
	}
	
	// 分數字符串
	public static String stringFraction(Fraction a) {
		if(a.denominator == 1)     // 分母為 1
			return String.valueOf((a.molecule));
		else
			return (a.molecule + "/" + a.denominator);
	}
	
	public static void main(String[] args){
		try {
			a = new Fraction();
			System.out.print("a = ");
			inputMolDen(a);     // 輸入 a
			
			b = new Fraction();
			System.out.print("b = ");
			inputMolDen(b);     // 輸入 b
			
			System.out.println("a+b = " + stringFraction(add(a, b)));
			
			System.out.println("a-b = " + stringFraction(subtraction(a, b)));
			
			System.out.println("a*b = " + stringFraction(multiplication(a, b)));
			
			System.out.println("a/b = " + stringFraction(division(a, b)));
			
		}catch(ArithmeticException e) {
			System.out.println("分母出現零");
		}
	}

}
/* Code Running Results a = 1/3 b = -1/2 a+b = -1/6 a-b = 5/6 a*b = -1/6 a/b = -2/3 */


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM