LeetCode居然不会保存提交过的代码,就先把写过的记在这里了。
func fractionToDecimal(_ numerator: Int, _ denominator: Int) -> String {
var num = numerator
var den = denominator
if num == 0 {
return "0"
}
if den == 0 {
return ""
}
var isNeg = false
if num < 0 {
num = -num
isNeg = !isNeg
}
if den < 0 {
den = -den
isNeg = !isNeg
}
let zs = num / den
var rstStr = ""
if isNeg {rstStr += "-"}
rstStr += "\(zs)"
var numDict = [Int:Int]()
var yushu = num % den
var i = 0
numDict[yushu] = i
var xunhuan = -1
if yushu != 0 {
rstStr += "."
}
var zsLenth = rstStr.count
while yushu != 0 {
i = i+1
var temp = yushu * 10 / den
rstStr += "\(temp)"
yushu = yushu * 10 % den
if numDict[yushu] != nil {
xunhuan = numDict[yushu]!
break;
}else {
numDict[yushu] = i
}
}
if xunhuan >= 0 {
rstStr.insert("(", at: rstStr.index(rstStr.startIndex, offsetBy: xunhuan+zsLenth))
rstStr += ")"
}
return rstStr
}
解法简单介绍:
整数部分求得值后,将余数x10 除以除数得出第一位小数。以此类推。
判断循环小数:每次计算前把余数放进字典,如果字典中已经有相同的余数则表示达到循环点。
边界条件的判断略过…