2017-06-04 80 views
0

迴文數字讀取方式相同。由兩個2位數字產品製成的最大回文數是9009 = 91×99.當我調用該函數時,它什麼也沒有顯示?

查找由兩個3位數字產品製成的最大回文數。

這是我在Python 3.5的腳本:

def plin1(): 
    for i in range(1000,1): 
     for j in range(1000,1): 
      if str(i*j)==str(i*j)[::-1]: 
       break 
      return i*j 
     print(i,'*',j,'=',i*j) 

但是,當我把這個功能,打印什麼。怎麼了?

回答

1

range(start, stop[, step]) -> range object

range()需要的第一個參數是小於第二當step是正的,並且step默認爲1時range()被調用以2個參數。因此,範圍對象產生一個空序列和for循環的身體從來沒有進入:

>>> list(range(1000, 1)) 
[] 

然而,通過指定step負值,你可以得到你需要,例如序列:

>>> list(range(10, 1)) 
[] 
>>> list(range(10, 1, -1)) 
[10, 9, 8, 7, 6, 5, 4, 3, 2] 

所以你的情況,你會做到這一點:

for i in range(999, 99, -1): 
    for j in range(999, 99, -1): 
     # etc... 

那麼這將遍歷起始於最大的全3位數字。

也使用return是不正確的,它會導致函數終止而不打印任何東西。這裏是一個更正的版本:

def plin1(): 
    for i in range(999, 99, -1): 
     for j in range(999, 99, -1): 
      if str(i*j) == str(i*j)[::-1]: 
       return i*j 
      print(i,'*',j,'=',i*j) 

現在函數只有當它找到迴文時才返回值。如果沒有迴文,該函數將返回None


但是,請注意,這不會產生兩個3位數的乘積的最大回文。這個函數返回580085,它是995 * 583.但是最大的一個是993 * 913 = 906609.你需要找出哪個是所有產品中最大的迴文,而不僅僅是找到的第一個迴文。這裏是一個發電機表達將產生所需的結果:

max((i*j,i,j) for i in range(100, 1000) for j in range(100, 1000) 
     if str(i*j) == str(i*j)[::-1]) 

其產生元組(906609, 993, 913)

可能會進行優化以減少計算次數。

+0

謝謝您的信息。固定範圍後,仍然不要爲什麼輸出總是1000000(百萬),請問你爲什麼告訴我? –

+0

@hamzabouabid:原因是該函數由於return語句的放置而立即返回。查看建議更正的更新答案。 – mhawke

+0

@hamzabouabid:還注意到'range()'包含結果中的第一個參數並排除了第二個參數。因此,您需要範圍從999到99來覆蓋所有3位數字,並且您不需要處理低於100的數字。 – mhawke

0

range有兩個參數i,j生成範圍從ij。如果i > j那麼沒有生成範圍,並且在該範圍內迭代時沒有任何反應。

範圍還需要一個「step」參數,允許您設置範圍的增量。也許你打算使用它。它看起來像這樣:

for i in range(1, 1000, 1): 
    # loop body 

請注意,指定步驟1是多餘的,因爲1是該參數的默認值。

如果你想生成一個「做正確的事」的範圍,以生成的(I,J)的較小的範圍越大,你可能會寫像下面這樣的函數:

def dwim_range(i,j): 
    return range(*sorted((i,j))) 

在這裏,您正在對元組(i, j)進行排序,然後使用*運算符對其進行解壓縮,以便range按排序順序獲取元組的兩項。

+0

有沒有一種方法可以生成從j到i的範圍,如果j> i我是說我希望檢查從最後開始。 –

+0

@hamzabouabid當然,請參閱編輯過的帖子,瞭解您可能會這樣做的一種建議。 –

相關問題