package main
import (
"fmt"
"time"
)
//题目14:
//
//以下迭代序列定义在整数集合上:
//
//n → n/2 (当 n 是偶数时)
//n → 3n + 1 (当 n 是奇数时)
//
//应用以上规则,并且以数字 13 开始,我们得到以下序列:
//
//13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
//
//可以看出这个以 13 开始以 1 结束的序列包含 10 个项。虽然还没有被证明(Collatz 问题),但是人们认为在这个规则下,以任何数字开始都会以 1 结束。
//
//以哪个不超过 100 万的数字开始,能给得到最长的序列?
//
//注意: 一旦序列开始之后,也就是从第二项开始,项是可以超过 100 万的。
var n = map[int64]int64{
1: 1,
2: 2,
}
func If(b bool, vt int64, vf int64) int64 {
if b == true {
return vt
} else {
return vf
}
}
func loop(a int64) int64 {
t := a
var c int64 = 0
for n[t] == 0 {
t = If(t%2 == 0, t/2, t*3+1)
c++
}
n[a] = n[t] + c
t = If(a%2 == 0, a/2, a*3+1)
p := a
for n[t] == 0 {
n[t] = n[p] - 1
p = t
t = If(a%2 == 0, a/2, a*3+1)
}
return n[a]
}
func main() {
t := time.Now()
var i int64
for i = 3; i < 1000000; i++ {
_ = loop(i)
}
var max = map[string]int64{
"key": 1,
"value": 1,
}
for key, value := range n {
if value > max["value"] {
max["value"] = value
max["key"] = key
}
}
fmt.Println(max)
tt := time.Now()
fmt.Println("耗时:", (tt.Nanosecond()-t.Nanosecond())/1e6, "ms")
}
输出:map[key:837799 value:525]
耗时: 309 ms
|