以下迭代序列定義在整數集合上:
n → n/2 (當n是偶數時)
n → 3n + 1 (當n是奇數時)
應用以上規則,並且以數字13開始,我們得到以下序列:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出這個以13開始以1結束的序列包含10個項。
雖然還沒有被證明(collatz問題),但是人們認為在這個規則下,以任何數字開始都會以1結束。
以哪個不超過100萬的數字開始,能給得到最長的序列?
注意: 一旦序列開始之後,也就是從第二項開始,項是可以超過100萬的。
def
get_collatz_len
(n):
"""
獲取序列長度
儲存各個數字開始的序列,求取新的序列時,從已獲知的序列字典中查詢
"""collatz_list =
while
1: if n in collatz_len_dict:
for i, collatz in enumerate(collatz_list):
collatz_len_dict[collatz] = len(collatz_list) - i + collatz_len_dict[n]
return collatz_len_dict[n] + len(collatz_list)
if n % 2:
n = 3 * n + 1
else:
n //= 2
#def get_len(n):
# """ 獲取序列長度 """
# collatz_len = 1
# while n != 1:
# if n % 2:
# n = 3 * n + 1
# else:
# n /= 2
# collatz_len += 1
# return collatz_len
# 儲存各個數字開始的序列
collatz_len_dict =
len_max = 0
i_collatz = 0
for i in range(1, 10 ** 6):
i_len = get_collatz_len(i)
if i_len > len_max:
len_max = i_len
i_collatz = i
print(i_collatz)
尤拉計畫 6
前十個自然數的平方和是 1 2 2 2 10 2 385 前十個自然數的和的平方是 1 2 10 2 552 3025 所以平方和與和的平方的差是3025 385 2640.找出前一百個自然數的平方和與和平方的差。def get square sub x 遞迴,展開行列式 if x 1 return...
尤拉計畫 15
從乙個2 2網格的左上角開始,有6條 不允許往回走 通往右下角的路。對於20 20的網格,這樣的路有多少條?def get load num x,y x,y 網格的路數等於 x 1,y x,y 1 if x 0 or y 0 return 1return get xy load x 1,y get ...
尤拉計畫 17
如果用英文寫出數字1到5 one,two,three,four,five,那麼一共需要3 3 5 4 4 19個字母。如果數字1到1000 包含1000 用英文寫出,那麼一共需要多少個字母?注意 空格和連字元不算在內。例如,342 three hundred and forty two 包含23個字...