2012-02-01 49 views
0

所以,我這說的Project Euler 145工作:項目歐拉較小的情況下沒有得到預期的結果145

一些積極的整數n有總和[ n + reverse(n) ]完全由奇(十進制)的數字財產。例如,36 + 63 = 99409 + 904 = 1313。我們會稱這些數字是可逆的;所以36,63,409和904是可逆的。在n或reverse(n)中不允許出現前零。

有一千個以下的120個可逆數字。

在10億(10 ** 9)以下有多少個可逆數字?

我想下面的代碼(而不是使用10^9我使用10到檢查結果(這應該是零)正在發生的事情:

def check(x): 
    y = int(str(x)[::-1]) #x backwards 
    #add the rev number to the original number (convert them to a list) 
    xy = list(str(x+y)) 
    #a list of even digits. 
    evens = ['0', '2', '4', '6', '8'] 
    #check if the number has any digits using intersection method. 
    intersect = set(xy).intersection(set(evens)) 
    if not intersect: 
     #if there was no intersection the digits must be all odd. 
     return True 
    return False 

def firstCheck(x): 
    if (int(str(x)[:1])+(x%10))%2 == 0: 
     #See if first number and last number of x make an even number. 
     return False 
    return True 

def solve(): 
    L = range(1, 10) #Make a list of 10 
    for x in L: 
     if firstCheck(x) == False: 
      #This quickly gets rid of some elements, not all, but some. 
      L.remove(x) 
    for x in L: 
     if check(x) == False: 
      #This should get rid of all the elements. 
      L.remove(x) 
    #what is remaining should be the number of "reversible" numbers. 
    #So return the length of the list. 
    return len(L) 

print solve() 

它的工作原理兩個部分:在方法solve有一個firstCheckcheck第一個檢查是快速消除一些數字(所以當我做一個10^9大小的列表,我可以釋放一些RAM)。第二個檢查是擺脫所有的數字可能不是「可逆數字」在第一個檢查中,我只看到第一個和最後一個數字是否爲偶數,然後消除該數字。檢查方法我反轉數字,將這兩個數字加在一起並將它們放入一個列表中,然後檢查它是否與evens列表相交,如果它從列表中消除。結果列表應該是「可逆」數字元素的數量,因此我將該列表並返回其長度。對於range(1,10)我得到2作爲結果(而不是所需的零)。而它沒有消除的數字[4,8],我似乎無法找出原因。

+0

注:1。您可以通過*計數*而不是管理列表來避免任何空間問題,這也更快。 2.這種方法很慢,並且不能很好地擴展,通過分析條件可以得到一個即時返回答案的解決方案,即使在10^20的範圍內也是如此。 – 2012-02-01 12:00:43

回答

1

我可以看到兩個問題。

首先,你(兩次)修改你迭代一個列表:

for x in L: 
    if firstCheck(x) == False: 
     #This quickly gets rid of some elements, not all, but some. 
     L.remove(x) 

這將導致意外和難以預知的行爲。無論是遍歷列表的副本或只過濾使用列表理解:

L = [x for x in L if firstCheck(x)] 

其次,你不檢查,以消除任何前導零,所以檢查(10)爲真時,它應該是False。解決了那些之後,你的代碼似乎工作:

>>> len(solve(10)) 
0 
>>> len(solve(1000)) 
120 

[我只是增加了一個參數來選擇範圍。]

+0

不應該檢查(10)是否爲真? 10 + 01 = 10 + 1 = 11其中,全部是奇數...... – Dair 2012-02-01 05:10:55

+0

@anon:「不能在n或reverse(n)中包含前導零。 – DSM 2012-02-01 05:11:47

+0

哦,等等,我誤讀了,我認爲這是說像它是前導零,他們不會被允許,所以消除零,然後做... – Dair 2012-02-01 05:14:39

0

Java解決方案,它需要3分鐘

public class Euler145 { 

public static void main(String[] args) { 

    int i, j, add, convert, count = 0; 
    String get; 
    StringBuilder rev; 

for (i=0; i <= 1000000000; i++) { 
     get = "" + i; 
     rev = new StringBuilder(get); 
     rev.reverse(): 
     convert = Integer.parseInt(rev.toString()); 
     add = convert + i; 

     if (add % 2 != 0) { 

      while (add > 0) { 
       j = add % 10; 

       if (j == 1 || j == 3 || j == 5 || j == 7 || j == 9) { 
        add /= 10; 
        String leadZero = "" + i; 
        if (j == 0 && !leadZero.endsWith("0")) { 
         count++; 
        } 
        } else { 
        break; 
       } 
      } 
     } 
    } 
     System.out.println(count); 
} 
} 
+3

這個問題是關於Python的 – Danh 2016-11-20 07:34:46

相關問題