-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCRational.jl
55 lines (54 loc) · 1.75 KB
/
CRational.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import Base: ==, <, >, <=, >=, +, -, *, ÷, /
import Base: zero, one, string, show
struct CRational
numerator::CInt
denominator::CInt
function CRational(numerator::CInt, denominator::CInt)
g = gcd(numerator, denominator)
if g != one(CInt)
numerator = numerator÷g
denominator = denominator÷g
end
return new(numerator, denominator)
end
end
function /(num1::CInt, num2::CInt)
return CRational(num1, num2)
end
function zero(::Type{CRational})
return CRational(zero(CInt), one(CInt))
end
function one(::Type{CRational})
return CRational(one(CInt), one(CInt))
end
function reciprocal(a::CRational)
return CRational(a.denominator, a.numerator)
end
function string(a::CRational)
s = string(a.numerator)*"/"*string(a.denominator)
a.numerator.flag ⊻ a.denominator.flag && (s = "-"*s)
return s
end
function show(io::IO, a::CRational)
print(io, string(a))
end
function +(num1::CRational, num2::CRational)
numerator = num1.numerator*num2.denominator+num1.denominator*num2.numerator
denominator = num1.denominator*num2.denominator
return CRational(numerator, denominator)
end
function -(num1::CRational, num2::CRational)
numerator = num1.numerator*num2.denominator-num1.denominator*num2.numerator
denominator = num1.denominator*num2.denominator
return CRational(numerator, denominator)
end
function *(num1::CRational, num2::CRational)
numerator = num1.numerator*num2.numerator
denominator = num1.denominator*num2.denominator
return CRational(numerator, denominator)
end
function ÷(num1::CRational, num2::CRational)
numerator = num1.numerator*num2.denominator
denominator = num1.denominator*num2.numerator
return CRational(numerator, denominator)
end