题目
给定两个整数分别代表分子和分母,以字符串的方式返回分数,如果分数部分重复,将重复的部分括在括号中。
如果有多个答案,返回任意一个。
解析
转换成分数,第一步应该将进行整数除法运算,得到整数商 integer 和余数 extra。如果余数为 0 ,直接返回整数,否则继续计算小数部分。
if extra recurring
find recurring and return
extra10 / numerator = quotient
extra10 % numerator = newextra
就是将分子除以分母,得到商和余数,余数进位后作为分子再次做除法。如果余数开始重复,就说明商也开始重复了。
伪代码
integer = denominator / numerator
extra = denominator / numerator
if extra = 0
return integer
for extra != 0
if extra is recurring
return integer.recurring
quotient = extra*10 / numerator
recurring[extra] = quotient idx
extra = extra*10 % numerator
return integer.nofraction
代码
func fractionToDecimal(numerator int, denominator int) string {
var rst string
neg := false
var fracs []int
fracm := make(map[int]int)
fracl := 0
if numerator < 0 {
neg = !neg
numerator = ^numerator+1
}
if denominator < 0 {
neg = !neg
denominator = ^denominator+1
}
integer := numerator / denominator
numerator = numerator % denominator
if numerator == 0 {
rst = isinteger(integer)
if integer == 0 {
return rst
}
goto RESULT
}
for numerator != 0 {
if k, ok := fracm[numerator]; ok {
rst = isrecurring(integer, fracs, k)
goto RESULT
}
quotient := numerator*10 / denominator
fracs = append(fracs, quotient)
fracl++
fracm[numerator] = fracl-1
numerator = numerator*10 % denominator
}
rst = isnorecurring(integer, fracs)
RESULT:
if neg {
rst = "-" + rst
}
return rst
}
func isinteger(integer int) string {
return int2string(integer)
}
func isrecurring(integer int, fracs []int, rec int) string {
return int2string(integer) + "." + fracs2string(fracs[:rec]) + "(" + fracs2string(fracs[rec:]) + ")"
}
func isnorecurring(integer int, fracs []int) string {
return int2string(integer) + "." + fracs2string(fracs)
}
func fracs2string(fracs []int) string {
bs := make([]byte, len(fracs))
for i := range fracs {
bs[i] = byte('0' + fracs[i])
}
return string(bs)
}
func int2string(integer int) string {
if integer == 0 {
return "0"
}
var bs []byte
for integer != 0 {
bs = append(bs, byte('0' + integer % 10))
integer = integer/10
}
for i:=0;i<len(bs)/2; i++ {
bs[i], bs[len(bs)-1-i] = bs[len(bs)-1-i], bs[i]
}
return string(bs)
}
后记
- 题目细节处理比较繁琐,要一步一步的来
- leetcode 改版了,看起来很高级,但是直观性还需要适应