为了账号安全,请及时绑定邮箱和手机立即绑定

考拉兹猜想的变体

标签:
Go


“考拉兹猜想”是一个数学上的未解之谜。

考拉兹猜想

对自然数 n 循环执行如下操作。

n 是偶数时,用 n 除以 2

n 是奇数时,用 n 乘以 3 后加 1

如此循环操作的话,无论初始值是什么数字,最终都会得到 1(会进入1 4 2 1 这个循环)。

这里我们稍微修改一下这个猜想的内容,即假设初始值为偶数时,也用 n 乘以 3 后加 1,但只是在第一次这样操作,后面的循环操作不变。而我们要考虑的则是在这个条件下最终又能回到初始值的数。

譬如,以2为初始值,则计算过程如下。

2  7  22  11  34  17  52  26  13  40  20  10  5  16  8  4  2

同样,如果初始值为4,则计算过程如下。

4  13  40  20  10  5  16 8  4

但如果初始值为6,则计算过程如下,并不能回到初始值6。

6  19  58  29  88  44  22  11  34  17  52  26  13 40  20  10  5  16  8  4  2  1  4  …

问题

求在小于 10000 的偶数中,像上述的 2 或者 4 这样“能回到初始值的数”有多少个。

package main

import "fmt"

func collatz(n int)bool{

    m := n * 3 + 1

    for{

        if m == 1{

            return false

        }else if m == n{

            return true

        }

        if m % 2 == 1{

            m = m * 3 + 1

        }else if m % 2 == 0{

            m = m / 2

        }

    }

}

func main(){

    var s []int

    for i:=2;i<10001;i+=2{

        if collatz(i){

            s = append(s, i)

        }

    }

    fmt.Println(s)

    fmt.Printf("共 %d 个数\n", len(s))

}

结果:

[2 4 8 10 14 16 20 22 26 40 44 52 106 184 206 244 274 322 526 650 668 790 866 976 1154 1300 1438 1732 1780 1822 2308 2734 3238 7288]

共 34 个数

本来用递归函数,发现有些麻烦,就用了for循环,发现很容易就搞定了,只需注意跳出循环的条件设计就好。

©著作权归作者所有:来自51CTO博客作者stlf2004的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消