2010-06-30 73 views
2

我再次在Project Euler上工作,這次問題#4。這個腳本的要點是找到兩個三位數字的最大回文產品。我認爲解決這個問題相當簡單,但我得到的答案太低。更具體地說,我得到580085,答案是906609.這個簡單的Python腳本爲什麼會顯示不正確的答案?

有人能告訴我這是什麼不對?

#!/usr/bin/env python 
# encoding: utf-8 
""" 
P4.py 

Created by Andrew Levenson on 2010-06-29. 
Copyright (c) 2010 __MyCompanyName__. All rights reserved. 
""" 

import sys 
import os 


def main(): 
    for x in range(100, 1000): 
     for y in range(100, 1000): 
      z = str(x * y) 
      s = str(z[::-1]) # Reverse z 
      if z == s: 
       t = z 
    print t 


if __name__ == '__main__': 
    main() 
+1

項目歐拉的要點是不是要自己滿意地找出答案? – wlashell 2010-06-30 01:30:04

+0

是的,但這不是解決問題的方法,因爲我已經在Perl中完成了這個任務。這是關於如何在Python中做到這一點,與我當時的做法不同。 :) – Andy 2010-06-30 01:35:18

+2

順便說一句:如果將第二個循環更改爲'for範圍(x,1000)'中的y,則可以完成一半的工作,並且沒有理由導入sys和os。 – 2010-06-30 01:54:42

回答

6

您的代碼不保證其打印最大的產品,因爲有可能以後是一個較小的產品,替代它。爲了解決這個問題,初始化t到零,並與

if z==s and int(z)>t: 
    t = int(z) 

或等價更換你的病情,

if z==s: 
    t = max(t,int(z)) 

編輯:固定INT /串的問題上面。避免轉換爲字符串並返回int類似於下面的內容有點乾淨:

def isPalindrome(x): 
    s = str(x) 
    return s == s[::-1] 

t = 0 
for x in range(100, 1000): 
    for y in range(100, 1000): 
     z = x * y 
     if isPalindrome(z) and z > t: 
      t = z 
print t 
+0

這些編輯不太正確:z是一個字符串,不是int。 – 2010-06-30 01:38:19

+0

您需要將它們作爲數字進行比較,而不是字符串。 – 2010-06-30 01:38:43

+0

我正在弄清楚爲什麼,但介紹您的修復產生輸出'99999' – Andy 2010-06-30 01:40:14

3

問題是要找到最大的迴文。你在這裏沒有什麼可以找到最大的,只是最後一個。你認爲最後一個會是最大的,但事實並非如此,因爲你正在研究整個ZxZ廣場的可能性。

例如,在考慮101 * 999後,您正在考慮200 * 101。

1

如果您發現的大於您已有的大小,您需要添加一個檢查。

2

由於您使用2 for循環的方式,您將獲得x值最大的數字,而不是最大的產品。

906609 = 993 * 913

那麼x不斷遞增,下一個迴文是:

580085 = 995 * 583

你需要一個變量來跟蹤的最大回文你已經找到。

def main(): 
    largest = 0 
    for x in range(100, 1000): 
     for y in range(100, 1000): 
      z = str(x * y) 
      s = str(z[::-1]) # Reverse z 
      if z == s: 
       t = int(z) 
       if t > largest: 
        largest = t 
    print largest 
6

這裏是做在一個單一的表達棘手,但正確的方法...:

def main(): 
    print max(p for x in range(100, 1000) for y in range(x, 1000) 
       for p in (x * y,) if str(p) == str(p)[::-1]) 

棘手的部分是單件for p條款,起着分配的角色(只停止重新計算該產品多次;-)。

注意,接受的答案是錯誤的(因爲有幾個人),因爲它看起來對字符串「最大」,這是從INT最大不同 - 嘗試運行它,你會看到! - )

+0

這非常整齊!雖然我更新編程,這將是一個obbu的地獄。 – Andy 2010-06-30 04:09:08

+1

@Andrew,也許 - 也許不是:我已經看到人們最近剛剛接受編程以列出理解(像上面那樣的基因組並不是太不同,我從未教導過新手,因爲基因組被引入,所以我有沒有直接的經驗)*比*更容易*,例如,真正的奧祕,如「x = x + 1」(「但是**怎麼**可以'x'可能等於自己加上一個?!沒有數字呢! )... ;-)。高級抽象編碼需要努力從(比如說)C那裏得到,但不一定比更低級別的東西,從「絕對零」到達那裏。 – 2010-06-30 04:59:44

+0

我喜歡你如何在'for'中使用1元組來彌補沒有'let'的Python! – Gabe 2012-02-26 06:02:49

0

我會補充說你可以節省一些時間在這個測試中。所有6位數的迴文數必須可以被11整除。因此,至少有一個因子必須可以被11整除。

相關問題