|
发表于 2022-2-24 21:36:24
|
显示全部楼层
- 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
复制代码 |
|