給定一個(gè)表示分?jǐn)?shù)加減運(yùn)算表達(dá)式的字符串,你需要返回一個(gè)字符串形式的計(jì)算結(jié)果。 這個(gè)結(jié)果應(yīng)該是不可約分的分?jǐn)?shù),即最簡(jiǎn)分?jǐn)?shù)。 如果最終結(jié)果是一個(gè)整數(shù),例如 2,你需要將它轉(zhuǎn)換成分?jǐn)?shù)形式,其分母為 1。所以在上述例子中, 2 應(yīng)該被轉(zhuǎn)換為 2/1。
解法:分子 = a分子b分母 + a分母b分子 ,分母 = a分母 * b分母
然后約分,約分需要用到歐幾里得算法求最大公約數(shù)
func gcd(_ a:Int ,_ b:Int) -> Int {
var inA = a,inB = b
if a > b {
inA = b
inB = a
}
while inA != 0 {
let temp = inA
inA = inB % inA
inB = temp
}
return abs(inB)
}
func fractionAddition(_ expression: String) -> String {
var n: Int = 0,d: Int = 1
var startIndex = expression.startIndex
while startIndex < expression.endIndex {
var leftIndex = startIndex
repeat {
leftIndex = expression.index(after: leftIndex)
}while (expression[leftIndex] != "/");
let range = expression[startIndex..<leftIndex]
let fenzi:Int = Int(String(range))!
var rightIndex = expression.index(after: leftIndex)
while (rightIndex < expression.endIndex && expression[rightIndex] != "+" && expression[rightIndex] != "-") {
rightIndex = expression.index(after: rightIndex)
}
let range2 = expression[expression.index(after: leftIndex)..<rightIndex]
let fenmu:Int = Int(String(range2))!
n = n*fenmu + fenzi*d
d = d * fenmu
let gcd = self.gcd(n, d)
n = n / gcd
d = d / gcd
startIndex = rightIndex
}
return "\(n)/\(d)"
}