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 */
