1. 程式人生 > >《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q06)

《程式設計師的演算法趣題》-(日)增井敏克 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個