代码拉取完成,页面将自动刷新
package main
import (
"fmt"
"math"
"strconv"
)
func splitIntoFibonacci(S string) (res []int) {
trace , n ,sumLen := make([]string,0,0) , len(S) ,0
maxStr := strconv.Itoa(math.MaxInt32)
var depth func(idx int)
depth = func(idx int) {
tn := len(trace)
// 用打印来调试回溯算法非常的方便。重点打印trace即可发现毛病 ,稍微臃肿不是毛病,逻辑完备就好.
if len(res) > 0 || (tn > 2 && !(strSum(trace[tn-2] ,trace[tn-3]) == trace[tn-1])) {
return
}
if n == sumLen && (len(trace) > 2 && strSum(trace[tn-2] , trace[tn-3]) == trace[tn-1]) {
for _ , v := range trace {
Val , _ := strconv.Atoi(v)
res = append(res, Val)
}
return
}
for i := idx + 1 ; i <= n ; i++ {
if S[idx] == '0' && i - idx > 1{
break
}
if strCompare(S[idx:i],maxStr) {
break
}
sumLen += i -idx
trace = append(trace, S[idx:i])
depth(i)
if len(res) > 0 {
return
}
trace = trace[:len(trace)-1]
sumLen -= i -idx
}
}
depth(0)
return res
}
func strSum(ls , ss string) (res string) {
n1 , n2 := len(ls) , len(ss)
if n1 < n2 {
ls , ss = ss ,ls
n1 , n2 = n2 , n1
}
idx, pos := 0 , 0
for idx < n2 {
v1 , v2 := ls[n1-1-idx] - '0' , ss[n2-1-idx] - '0'
res = strconv.Itoa((int((v1+v2))+pos)%10) + res
pos = (int(v1 + v2) + pos) / 10
idx ++
}
// 添加pos和剩余位
for idx < n1 {
v := pos + int(ls[n1-1-idx] - '0' )
res = strconv.Itoa(v%10) + res
pos = v / 10
idx ++
}
if pos != 0 {
res = "1" + res
}
return res
}
func strCompare(s1,s2 string) bool {
if len(s1) > len(s2) {
return true
}
if len(s1) == len(s2) {
return s1 > s2
}
return false
}
func main() {
fmt.Println(splitIntoFibonacci("3611537383985343591834441270352104793375145479938855071433500231900737525076071514982402115895535257195564161509167334647108949738176284385285234123461518508746752631120827113919550237703163294909"))
fmt.Println(int32(1 << int32(31) -1 ))
fmt.Println(math.MaxInt32)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。