1 package com.lovo; 2 3 /** 4 * 分数类 5 * @author 叶鹏 6 * 7 */ 8 public class Rational { 9 private int num; // 分子 10 private int den; // 分母 11 12 /** 13 * 构造器 14 * @param num 分子 15 * @param den 分母 16 */ 17 public Rational(int num, int den) { 18 this.num = num; 19 this.den = den; 20 normalize(); 21 } 22 23 /** 24 * 构造器 25 * @param str 代表一个分数的字符串 26 */ 27 public Rational(String str) { 28 String s1 = str.split("/")[0]; // 分子的字符串 29 String s2 = str.split("/")[1]; // 分母的字符串 30 this.num = Integer.parseInt(s1); 31 this.den = Integer.parseInt(s2); 32 normalize(); 33 } 34 35 /** 36 * 构造器 37 * @param x 一个小数 38 */ 39 public Rational(double x) { 40 this.num = (int) (x * 10000); 41 this.den = 10000; 42 simplify(); 43 normalize(); 44 } 45 46 /** 47 * public Rational add(Rational other) { ... } 48 * 访问修饰符 返回类型 方法名(参数列表) { ... } 49 * 加法 50 * @param other 另一个分数 51 * @return 两个分数相加的结果 52 */ 53 public Rational add(Rational other) { 54 return new Rational(this.num * other.den + this.den * other.num, this.den * other.den).normalize(); 55 } 56 57 /** 58 * 减法 59 * @param other 另一个分数 60 * @return 两个分数相减的结果 61 */ 62 public Rational sub(Rational other) { 63 return new Rational(this.num * other.den - this.den * other.num, this.den * other.den).normalize(); 64 } 65 66 /** 67 * 乘法 68 * @param other 另一个分数 69 * @return 两个分数相乘的结果 70 */ 71 public Rational mul(Rational other) { 72 return new Rational(this.num * other.num, this.den * other.den).normalize(); 73 } 74 75 /** 76 * 除法 77 * @param other 另一个分数 78 * @return 两个分数相除的结果 79 */ 80 public Rational div(Rational other) { 81 return new Rational(this.num * other.den, this.den * other.num).normalize(); 82 } 83 84 /** 85 * 化简 86 * @return 化简后的分数对象 87 */ 88 public Rational simplify() { 89 if(num != 0) { 90 int divisor = gcd(Math.abs(num), Math.abs(den)); 91 num /= divisor; 92 den /= divisor; 93 } 94 return this; 95 } 96 97 /** 98 * 正规化 99 * @return 正规化以后的分数对象 100 */ 101 public Rational normalize() { 102 if(this.num == 0) { 103 this.den = 1; 104 } 105 else if(this.den < 0) { 106 this.den = - this.den; 107 this.num = - this.num; 108 } 109 return this; 110 } 111 112 public String toString() { 113 return num + (den != 1? ("/" + den) : ""); 114 } 115 116 private int gcd(int x, int y) { 117 if(x > y) { 118 int temp = x; 119 x = y; 120 y = temp; 121 } 122 for(int i = x; i > 1; i--) { 123 if(x % i == 0 && y % i == 0) { 124 return i; 125 } 126 } 127 return 1; 128 } 129 }
1 package com.lovo; 2 3 import java.util.Scanner; 4 5 public class Test01 { 6 7 public static void main(String[] args) { 8 Scanner sc = new Scanner(System.in); 9 System.out.print("r1 = "); 10 String str1 = sc.next(); 11 Rational r2 = new Rational(0.3); 12 13 Rational r1 = new Rational(str1); 14 15 System.out.printf("%s + %s = %s\n", r1, r2, r1.add(r2).simplify()); 16 System.out.printf("%s - %s = %s\n", r1, r2, r1.sub(r2).simplify()); 17 System.out.printf("%s * %s = %s\n", r1, r2, r1.mul(r2).simplify()); 18 System.out.printf("%s / %s = %s\n", r1, r2, r1.div(r2).simplify()); 19 20 sc.close(); 21 } 22 }
时间: 2024-10-25 21:11:35