Created
August 13, 2015 23:18
-
-
Save takatoshi/29e1c50919e62ac19886 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
class Fraction { | |
var n: Int | |
var d: Int | |
init(numerator: Int, denominator:Int) { | |
self.n = numerator | |
self.d = denominator | |
} | |
var description: String { | |
if isImproper { | |
return mixedPart > 0 ? "\(wholePart) \(mixedPart)/\(d)" : "\(wholePart)" | |
} | |
return d == 1 ? "\(n)" : "\(n)/\(d)" | |
} | |
var value: Double { | |
get { return Double(n) / Double(d) } | |
} | |
var isImproper: Bool { | |
get { return n >= d } | |
} | |
var wholePart: Int { | |
get { return n / d } | |
} | |
var mixedPart: Int { | |
get { return n % d } | |
} | |
} | |
// 最大公約数 | |
func greatestCommonDenominator(first: Int, second: Int) -> Int { | |
return second == 0 ? first : greatestCommonDenominator(second, first % second) | |
} | |
func * (left: Fraction, right: Fraction) -> Fraction { | |
var n = left.n * right.n | |
var d = left.d * right.d | |
let g = greatestCommonDenominator(n, d) | |
n /= g | |
d /= g | |
return Fraction(numerator: n, denominator: d) | |
} | |
func * (left: Int, right: Fraction) -> Fraction { | |
return Fraction(numerator: left, denominator: 1) * right | |
} | |
func * (left: Fraction, right: Int) -> Fraction { | |
return left * Fraction(numerator: right, denominator: 1) | |
} | |
func / (left: Fraction, right: Fraction) -> Fraction { | |
var n = left.n * right.d | |
var d = left.d * right.n | |
let g = greatestCommonDenominator(n, d) | |
n /= g | |
d /= g | |
return Fraction(numerator: n, denominator: d) | |
} | |
func / (left: Int, right: Fraction) -> Fraction { | |
return Fraction(numerator: left, denominator: 1) / right | |
} | |
func / (left: Fraction, right: Int) -> Fraction { | |
return left / Fraction(numerator: right, denominator: 1) | |
} | |
func + (left: Fraction, right: Fraction) -> Fraction { | |
var n = left.n * right.d + right.n * left.d | |
var d = left.d * right.d | |
let g = greatestCommonDenominator(n, d) | |
n /= g | |
d /= g | |
return Fraction(numerator: n, denominator: d) | |
} | |
func + (left: Int, right: Fraction) -> Fraction { | |
return Fraction(numerator: left, denominator: 1) + right | |
} | |
func + (left: Fraction, right: Int) -> Fraction { | |
return left + Fraction(numerator: right, denominator: 1) | |
} | |
func - (left: Fraction, right: Fraction) -> Fraction { | |
var n = left.n * right.d - right.n * left.d | |
var d = left.d * right.d | |
let g = greatestCommonDenominator(n, d) | |
n /= g | |
d /= g | |
return Fraction(numerator: n, denominator: d) | |
} | |
func - (left: Int, right: Fraction) -> Fraction { | |
return Fraction(numerator: left, denominator: 1) - right | |
} | |
func - (left: Fraction, right: Int) -> Fraction { | |
return left - Fraction(numerator: right, denominator: 1) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@takatoshi Thanks for your class! I've added init by String. It helps in real life usage.
https://gist.github.com/lanserxt/2d08ca8de2ca8f416973741a0cce498a