《程序员的算法趣题》-(日)增井敏克 Python解题 -- (Q06)

《程序员的算法趣题》-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言。有兴趣的同学,可以购书阅读~

在此更新个人编写的Python版,仅供学习使用。(运行环境:Python3.6)

Q06 (改版)考拉兹猜想

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

考拉兹猜想
对自然数 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 这样“能回到初始值的数”有多少个。

counter = 0
for num in range(2, 10001, 2):
    calc_num = num*3 + 1

    while calc_num != 1:
        if calc_num % 2 == 0:
            calc_num /= 2
        else:
            calc_num = calc_num*3 + 1

        if calc_num == num:
            counter += 1

print("能回到初始值的数有%s个" % counter)

 运行结果:

                能回到初始值的数有34个

猜你喜欢

转载自blog.csdn.net/cloudly89/article/details/84312995