涉及到的知識點:
檢查先決條件。
函數重載。
操作符重載。
控制檯輸入。
私有函數。
隱式轉換。
<pre name="code" class="java">import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
class Rational(n:Int, d:Int){
require(d != 0);//檢查先決條件
private val g = gcd(n.abs, d.abs);
val num: Int = n / g;
val den: Int = d / g;
override def toString = n +"/"+ d;//重載tosting
def this(n: Int) = this(n, 1);
def +(that: Rational): Rational = //定義操作符號
new Rational(
num * that.den + that.num * den,
den * that.den
)
def *(that: Rational): Rational =
new Rational(num * that.num, den * that.den)
def *(i: Int): Rational = //重載*
new Rational(i*num, den)
def lessThan(that: Rational) =
this.num * that.den < that.num * this.den
def max(that: Rational) =
if(this.lessThan(that)) that else this
private def gcd(n: Int, d:Int): Int =//私有函數
if(d==0) n else gcd(d, n%d)
}
object Rational {
def main(args: Array[String]){
var bf = new BufferedReader(new InputStreamReader(System.in));
var line = bf.readLine();
var eles = line.split(" ")
val R1 = new Rational(Integer.parseInt(eles(0)), Integer.parseInt(eles(1)));
line = bf.readLine();
eles = line.split(" ");
val R2 = new Rational(Integer.parseInt(eles(0)), Integer.parseInt(eles(1)));
val R3 = R1 + R2;
val R4 = new Rational(2);
implicit def intToRational(x: Int) = new Rational(x)//隱式轉換
//隱式轉換要放在作用域,而不是放在類內!
val R5 = 2 * R3;
println(R5);
}
}