簡體   English   中英

找到兩個三位數的最大回文乘積:邏輯錯誤是什么?

[英]Finding the largest palindrome product of two 3-digit numbers: what is the error in logic?

我想通過以下方式解決此問題:從兩個值999的變量開始,在一個遞減一個的循環中將另一個相乘直到找到回文。 代碼是這樣的:

def is_palindrome(n):
  if str(n) == str(n)[::-1]:
    return True
  else:
    return False

def largest_palindrome_product_of_3_digit():
  x = 999
  y = 999
  for i in reversed(range(x + y + 1)):
    if is_palindrome(x * y):
      return x * y
    if i % 2 == 0:
      x -= 1
    else:
      y -= 1

我的方法的結果是698896,而正確的結果是906609。您能指出我邏輯不正確的地方嗎?

這里有一些提示:

  1. 如果n = y * x是(600000,700000)范圍內的任何數字(例如),且y <= x和x <1000,則x的最小可能值是多少?
  2. 如果n是回文數,則其第一位和最后一位均為6,那么x和y的最后一位代表什么呢?

現在概括並找出一種有效的算法。 :)

我以前從來沒有做過這個問題,但是我只是編碼了一個相當快速的算法,它比使用的蠻力搜索快2000倍

for x in xrange(2, 1000): 
    for y in xrange(2, x+1):
        n = y*x
        #etc

根據timeit.py,在我的舊機器上,蠻力算法大約需要1.29秒,而我上面暗示的算法大約需要747微秒。


編輯

我改善了邊界(並稍加修改了算法),並將時間縮短至410微秒。 :)

要在評論中回答您的問題:

是的,我們可以在范圍起點的平方根處開始x,並且可以在x處終止y(以防萬一我們找到回文平方)。

我的第二個提示是,對於x = 10 * I + i,y = 10 * J + j,我們不需要測試i和j的所有81個組合,我們只需要測試它們其中(i * j)%10等於我們想要的數字。 因此,如果我們知道回文起始於9,則(i,j)必須位於[(1,9),(3,3),(7,7),(9,1)]中。

我不認為我應該在這里發布實際的代碼; 在SO上發布完整的解決方案以解決Euler問題,這被認為是不好的形式。 也許有些SO人甚至在人們提供提示時都不喜歡它。 也許這就是為什么我投票不足...

您缺少可能的數字。

您正在考慮O(x + y)數,並且需要考慮O(x * y)數。 從本質上講,您的選擇是將其中一個從999循環到1,然后遞減另一個,然后...

簡單演示:

>>> want = set()
>>> for x in [1, 2, 3, 4, 5]:
...   for y in [1, 2, 3, 4, 5]:
...     want.add(x * y)
... 
>>> got = set()
>>> x = 5
>>> y = 5
>>> for i in reversed(range(x + y + 1)):
...   got.add(x * y)
...   if i % 2:
...     x -= 1
...   else:
...     y -= 1
... 
>>> want == got
False

或者,您確實知道范圍的頂部(999 * 999),並且可以生成該范圍內的所有回文數,從最高到最低。 從那里開始,進行質因子分解並檢查是否存在因子乘數分裂為[100,999]范圍內的兩個數是不重要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM