簡體   English   中英

使用python項目Euler#4。 我的代碼有什么問題?

[英]Project Euler #4 with python. What;s wrong with my code?

我正在嘗試使用python做項目Euler問題4。 問題陳述如下:

回文數在兩個方向上都相同。 由兩個兩位數的乘積構成的最大回文數為9009 = 91×99。

查找由兩個3位數字的乘積組成的最大回文。

我為此寫下了一個解決方案:

s=0
x=100
y=100
list=[]
z=x*y
def palindrome():
    while z>=1:
        s=s*10+z%10
        z=z/10
        if z==s:
            list.append(z)
while x<=999:
    while y<=999:
        palindrome()
        y=y+1
    x=x+1
    y=100
print list

最終按照“超出分配的z引用”的方式給出了錯誤。

在最終決定使用語法“ global”繞過此錯誤之前,我搜索了此錯誤的解決方案。

s=0
x=100
y=100
list=[]
z=x*y
def palindrome():
    global z
    global s
    global x
    global y
    global list
    while z>=1:
        s=s*10+z%10
        z=z/10
        if z==s:
            list.append(z)
while x<=999:
    while y<=999:
        palindrome()
        y=y+1
    x=x+1
    y=100
print list

現在它沒有給出錯誤,但是給出了一個空列表作為輸出。 我試圖通過在兩者之間插入打印語句來調試代碼。 循環似乎可以正常工作,因為“ x”和“ y”會打印出所有應有的值。 但是,我得到一個空列表作為打印列表命令的輸出,盡管我使用了while循環來更改x和y的值,但是'z'顯然沒有改變值並且卡在100000。

我不知道如何從這里開始。

您得到的錯誤可能是:

UnboundLocalError: local variable 'z' referenced before assignment

這意味着z沒有定義,至少不在palindrome()函數中。 您添加global關鍵字的解決方案在技術上是正確的。 但是,正如其他人已經指出的那樣,使用全局變量會使代碼難以遵循。

我不清楚palindrome()應該做什么。 是否應該檢查數字是否是回文? 生成回文數? 要解決此問題,您應該考慮結構化代碼。 當然,有很多方法可以做到,隨着時間的流逝,您將找到自己的風格。

因此,我的建議是考慮您一般如何解決此問題。 如果您不知道解決方案,那么編碼將無濟於事。 有時,在解決此類問題時,我在編寫函數時不聲明其主體。 您可以自上而下或自下而上地完成這兩項工作。 例如:

def is_palindrome(n):
    """ Check if n is a palindrome number. """
    pass

def multiples_of_3_digits():
    """ Return all numbers that are the product of two 3-digit numbers ."""
    pass

def main():
    print max(n for n in multiples_of_3_digits() if is_palindrome(n))

這樣,您可以專注於解決問題,然后專注於實際編碼。 也許您將添加幫助程序功能或意識到可以以更有效的方式解決問題,但這只是一個開始。 祝好運!

min=100
max=999
max_palindrome = 0
for a in range(min,max + 1):
    for b in range(a + 1, max + 1):
        prod = a*b
        if prod > max_palindrome and str(prod)==(str(prod)[::-1]):
            max_palindrome = prod
print max_palindrome

在這里,我們僅關注最大回文,因此,一旦已知其他回文數不是最大,我們就不會花費任何時間來存儲它們。 同樣,if語句首先使用字符串強制轉換和列表切片檢查給定產品是否大於最大已知回文數,然后檢查該數字是否甚至是回文數。 這將加快我們的代碼的速度,因為無論所討論的產品是否是回文,大於比較通常都會失敗。 當我們運行它時,我們得到以下內容。

906609

替代方式:

由於其他人指出的原因,我不鼓勵您使用全局變量。 我也希望您參考安德烈的方法,因為它會教您如何組織自己。 在這種方法中,我也將使用2個函數is_palindrome(num)[檢查數字是否為回文數]和find_max_palindrome [查找最大的回文數]

def is_palindrome(num):
    reversed = 0
    original = num

    if num < 10:
        return True
    if num % 10 == 0:
        return False

    while num >= 1:
        reversed = (reversed * 10) + (num % 10)
        num = num/10

    if original == reversed:
        return True
    else:
        return False

def find_max_palindrome():
    max_palindrome = 0
    a = 999
    b = 999
    prod = 0

    while a > 99:
        b = 999
        while b >= a:
            prod = a*b
            if prod > max_palindrome and is_palindrome(prod):
                max_palindrome = prod
            b = b -1
        a = a - 1

    return max_palindrome

print find_max_palindrome()

暫無
暫無

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

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