尤拉計畫 55

2021-07-25 21:01:26 字數 1665 閱讀 1665

我們將47與它的逆轉相加,47 + 74 = 121, 可以得到乙個回文。

並不是所有數都能這麼快產生回文,例如:

349 + 943 = 1292,

1292 + 2921 = 4213

4213 + 3124 = 7337

也就是說349需要三次迭代才能產生乙個回文。

雖然還沒有被證明,人們認為一些數字永遠不會產生回文,例如196。

那些永遠不能通過上面的方法(逆轉然後相加)產生回文的數字叫做lychrel數。

因為這些數字的理論本質,同時也為了這道題,我們認為乙個數如果不能被證明的不是lychrel數的話,那麼它就是lychre數。

此外,對於每個一萬以下的數字,你還有以下已知條件:

這個數如果不能在50次迭代以內得到乙個回文,那麼就算用盡現有的所有運算能力也永遠不會得到。

10677是第乙個需要50次以上迭代得到回文的數,它可以通過53次迭代得到乙個28位的回文:4668731596684224866951378664。

令人驚奇的是,有一些回文數本身也是lychrel數,第乙個例子是4994。

10000以下一共有多少個lychrel數?

def

is_palindrome

(x):

""" 判斷x是否回文 """

x_str = str(x)

x_len = len(x_str)

if x_str[:x_len // 2] == x_str[-1:-(x_len // 2 + 1):-1]:

return

true

else:

return

false

return

true

# 直接計算

lychrel_num = 0

for i in range(10000):

j = i

for _ in range(50):

k = int(str(j)[::-1])

j += k

if is_palindrome(j):

break

ifnot is_palindrome(j):

lychrel_num += 1

print(lychrel_num)

# 引入not_lychrel標誌,快取計算過的資料

# 如判斷349後,943、1292、2921、4213、3124無需判斷

not_lychrel = [false] * 10000

lychrel_num = 0

for i in range(10000):

if not_lychrel[i]:

continue

j = i

l =

for _ in range(50):

k = int(str(j)[::-1])

j += k

if is_palindrome(j):

break

if is_palindrome(j):

for l_ in l[:-1]:

if l_ < 10000:

not_lychrel[l_] = true

else:

lychrel_num += 1

print(lychrel_num)

尤拉計畫 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...

尤拉計畫 14

以下迭代序列定義在整數集合上 n n 2 當n是偶數時 n 3n 1 當n是奇數時 應用以上規則,並且以數字13開始,我們得到以下序列 13 40 20 10 5 16 8 4 2 1 可以看出這個以13開始以1結束的序列包含10個項。雖然還沒有被證明 collatz問題 但是人們認為在這個規則下,...

尤拉計畫 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 ...