演算法趣題Q5 改版 考拉茲猜想

2021-08-26 09:29:21 字數 1526 閱讀 8970

考拉茲猜想

對自然數 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 這樣「能回到初始值的數」有 多少個。

如何解決:

一開始我的思路:

ls=#用來儲存需要的資料

for i in range(2,10000):

a=i*3+1

#第一次變化後的值,第一次都需要乘以3加上1

while true:

ifa%2==1:#如果是奇數

a=a*3+1

else:

a=a/2

ifa==i:

break

print(ls,len(ls))

經過一次次迴圈,如果最後結果與 i 相等那麼就記錄下來並且退出迴圈。但是會發現乙個問題,如果是i=3,那麼在while中會陷入死迴圈,a永遠不可能等於i。

所以我再次觀察了前面幾組資料,發現無論資料怎麼變化到最後都會得到乙個值1

到最後一直是4 2 1 4 2 1 進行迴圈。而且如果 i 是符合猜想的,那麼在數字變為1 之前,能回到初始值的數。

ls=#用來儲存需要的資料

for i in range(2,10000):

a=i*3+1

#第一次變化後的值,第一次都需要乘以3加上1

while true:

ifa%2==1:#如果是奇數

a=a*3+1

else:

a=a/2

ifa==i:

break

elif a==1:

break

print(ls,len(ls))

最重要還是要找到:如果 i 是符合猜想的,那麼在數字變為1 之前,能回到初始值的數。

演算法趣題Q3 翻牌

這裡有100 張寫著數字1 100 的牌,並按順序排列著。最開始所有 牌都是背面朝上放置。某人從第2 張牌開始,隔1 張牌翻牌。然後第2,4,6,100 張牌就會變成正面朝上。接下來,另乙個人從第3 張牌開始,隔2 張牌翻牌 原本背面朝上 的,翻轉成正面朝上 原本正面朝上的,翻轉成背面朝上 再接下來...

程式設計師的演算法趣題 Q3翻牌

這裡有 100 張寫著數字 1 100 的牌,並按順序排列著。最開始所有牌都是背面朝上放置。某人從第 2 張牌開始,隔 1 張牌翻牌。然後第 2,4,6,100 張牌就會變成正面朝上。接下來,另乙個人從第 3 張牌開始,隔 2 張牌翻牌 原本背面朝上的,翻轉成正面朝上 原本正面朝上的,翻轉成背面上 ...

每週一道演算法題008 考拉茲猜想

考拉茲猜想 對自然數n迴圈執行如下操作。n是偶數時,用n除以2 n是奇數時,用n乘以3後加1 如此迴圈操作的話,無論初始值是什麼數字,最終都會得到1 會進入1 4 2 1這個迴圈 現在設定初始值為偶數時,對其進行乘以3後加1,後續操作不變。如 4 13 40 20 10 5 16 8 4 10000...