Java實現分數的四則運算
自己的寫法
markdown太久沒寫格式不會用了--將就着看
- Fraction.java
package com.lanou;
public class Fraction {
private int numerator1; //定義屬性:分子1
private int denominator1; //定義屬性:分母1
private String operator; //定義屬性:運算符
private int numerator2; //定義屬性:分子2
private int denominator2; //定義屬性:分母2
//構造方法
//constructor生成
public Fraction(int numerator1, int denominator1, String operator, int numerator2, int denominator2) {
this.numerator1 = numerator1;
this.denominator1 = denominator1;
this.operator = operator;
this.numerator2 = numerator2;
this.denominator2 = denominator2;
}
//加法
public void addition() {
int x = numerator1 * denominator2 + numerator2 * denominator1;
int y = denominator1 * denominator2;
gcd(x,y);
}
//減法
public void subtraction() {
int x = numerator1 * denominator2 - numerator2 * denominator1;
int y = denominator1 * denominator2;
gcd(x,y);
}
//乘法
public void multiplication(){
int x = numerator1 * numerator2;
int y = denominator1 * denominator2;
gcd(x,y);
}
//除法
public void division(){
int x = numerator1 * denominator2;
int y = denominator1 * numerator2;
gcd(x,y);
}
//歐幾里得+判斷輸出
public int gcd(int m,int n) {
//定義四個空變量
int r;
int t;
int u;
int w;
//t和w用來存儲分子和分母的初始數據
t = m;
w = n;
//求最大公因數
while (n != 0) {
r = m % n;
m = n;
n = r;
}
//循環結束后此時m即為最大公因數
//放個u = m看着方便
u = m;
//分子分母分別除以最大公因數
t = t / u;
w = w / u;
//判斷+輸出
//分子分母都為1 直接輸出1
if(t == 1 && w == 1){
System.out.println("1");
}
//分子為0 分母不為0 直接輸出0
else if(t == 0 && w != 0){
System.out.println("0");
}
//分子分母都不為0且不為1 直接輸出
else {
System.out.println(t + "/" + w);
}
return 0;
}
}
- MainClass.java
package com.lanou;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
System.out.println("請輸入按分子1分母1運算符分子2分母2的形式輸入數據");
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
String o = scanner.next();
int c = scanner.nextInt();
int d = scanner.nextInt();
//判斷分母是否為0 若為0重新輸入 不為0繼續判斷
if (b == 0 || d == 0){
System.out.println("分母不能為零,請重新輸入");
a = scanner.nextInt();
b = scanner.nextInt();
o = scanner.next();
c = scanner.nextInt();
d = scanner.nextInt();
}
//判斷o中是否是運算符
if (!o.equals("+") && !o.equals("-") && !o.equals("*") && !o.equals("/")){
System.out.println("運算符輸入錯誤,請重新輸入");
a = scanner.nextInt();
b = scanner.nextInt();
o = scanner.next();
c = scanner.nextInt();
d = scanner.nextInt();
}
Fraction fraction = new Fraction(a, b, o, c, d);
if (o.equals("+")){
fraction.addition();
}
else if (o.equals("-")){
fraction.subtraction();
}
else if (o.equals("*")){
fraction.multiplication();
}
else if (o.equals("/")){
fraction.division();
}
}
}
大仁哥的寫法
/**
* @author lizhongren1.
*/
public class Fraction {
// 分子(numerator)
private int ntNum;
// 分母(Denominator)
private int doNum;
// 構造方法, 這里沒寫空的構造方法, 換句話說就是要求必須要有分子和分母.
public Fraction(int ntNum, int doNum) {
this.ntNum = ntNum;
this.doNum = doNum;
if (doNum == 0){
// 分母不能為0
System.out.println("分母不能為0, 已經改為1");
this.doNum = 1;
}
// 創建新分數之后進行約分處理
reduce();
}
// 分數加法
public Fraction add(Fraction f){
// a/b + c/d
// 生成新的分子: a * d + b * c
int newNt = ntNum * f.getDoNum() + doNum * f.getNtNum();
// 生成新的分母: b * d
int newDo = doNum * f.getDoNum();
// 使用新的分子分母創建一個新的分數對象
Fraction newF = new Fraction(newNt, newDo);
return newF;
}
// 約分方法: 把分數化為最簡分數, 即 6/12 化為 1/2
// 此方法和下一個方法都不想讓外部調用, 因此設置為private
private void reduce(){
// 獲得最大公約數
int m = maxDe(ntNum, doNum);
ntNum = ntNum / m;
doNum = doNum / m;
}
// 最大公約數: 使用輾轉相除法(又名歐幾里德算法, 別問我怎么來的, 去問歐幾里德)
private int maxDe(int a, int b){
while(b != 0)
{
int r = a % b;
a = b;
b = r;
}
return a;
}
// 輸出字符串, 按照 分子/分母的形式輸出
@Override
public String toString() {
// 分子為0時輸出0
if (ntNum == 0){
return "0";
}
// 分子分母相同時輸出1
if (ntNum == doNum){
return "1";
}
// 其余方式按 分子/分母 輸出
return ntNum + "/" + doNum;
}
// getter/setter方法
public int getNtNum() {
return ntNum;
}
public void setNtNum(int ntNum) {
this.ntNum = ntNum;
}
public int getDoNum() {
return doNum;
}
public void setDoNum(int doNum) {
this.doNum = doNum;
}
// main方法測試
public static void main(String[] args) {
Fraction f1 = new Fraction(1,3);
Fraction f2 = new Fraction(4,9);
// 分數f1 加上 分數f2
Fraction nf = f1.add(f2);
System.out.println(nf);
System.out.println(nf.add(new Fraction(9,12)));
}
}
-
輸入與輸出
-
測試數據
-
輸入格式:分子1 回車 分母1 回車 運算符 回車 分子2 回車 分母2 回車
-
1/4+1/4
-
0/4+0/4
-
4/0+4/0