Skip to content

Instantly share code, notes, and snippets.

@takatoshi
Created August 13, 2015 23:18
Show Gist options
  • Save takatoshi/29e1c50919e62ac19886 to your computer and use it in GitHub Desktop.
Save takatoshi/29e1c50919e62ac19886 to your computer and use it in GitHub Desktop.
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)
}
@lanserxt
Copy link

lanserxt commented Nov 30, 2018

@takatoshi Thanks for your class! I've added init by String. It helps in real life usage.
https://gist.github.com/lanserxt/2d08ca8de2ca8f416973741a0cce498a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment