考拉茲猜想
對自然數 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...