2013-05-11 4 views
0

내 질문은 내가 오일러 ​​145의 올바른 경로를 따라 내려가는 경우이며, 효율성면에서는 다소 효율적입니다. 나는 그것의 대부분을 가지고있다, 나의 Defs 중 하나는 나에게 int check (str (마비) [: i]) % 2 == 0으로 문제를주고있다. 내 코드는 아래 있습니다. 10 호선이 문제 지점입니다Python : Project Euler 145

def reversed(reg): # to flip the number around 
    fliped = str(reg)[::-1]; 
    return(int(fliped)); # Return it as a int. 

def allEvenDigits(numb): # This is the issue one 
    hasEvenNumb = False; 
    for i in range(0, len(str(numb))): 
     if int(str(numb)[:i])%2 == 0: # if int of the string numb's char at i is even 
      hasEvenNumb = True; ## return that it is true 
      break; # why go on if we found a even. 
    return(hasEvenNumb); 


for i in range(1, 1000): # its 1000 to save a few minutes 
    revNumb = reversed(i); 
    total = revNumb+i; 
    if(allEvenDigits(total)): 
     print(i, "+" , revNumb, "=",Total); 
+1

PLE 예를 들어, 당신은 36 다음 63를 해결 할 이유가 없다 해결 한 경우 파이썬에서는';'을 사용하지 않습니다. 그것은'str (1234) [: 0]'이 –

+1

인 것을 보게됩니다. 또한'reversed'는 내장 함수입니다. 당신은 그것을 덮어 써서는 안됩니다. – Volatility

답변

1

내장 기능 all()을 사용하고 세트를 사용하여 이미 해결 된 번호 트랙을 유지할 수 있습니다.

seen = set() 

def allEvenDigits(numb): # This is the issue one 
    return all(int(n)%2 == 0 for n in str(numb)) 

for i in range(1, 1000): # its 1000 to save a few minutes 
    revNumb = reversed(i); 
    total = revNumb+i; 

    if i not in seen and revNumb not in seen: 
     if (allEvenDigits(total)): 
      print(i, "+" , revNumb, "=",total); 
      seen.add(i) 
      seen.add(revNumb) 

출력 :

(1, '+', 1, '=', 2) 
(2, '+', 2, '=', 4) 
(3, '+', 3, '=', 6) 
(4, '+', 4, '=', 8) 
(11, '+', 11, '=', 22) 
(13, '+', 31, '=', 44) 
(15, '+', 51, '=', 66) 
(17, '+', 71, '=', 88) 
(22, '+', 22, '=', 44) 
(24, '+', 42, '=', 66) 
(26, '+', 62, '=', 88) 
(33, '+', 33, '=', 66) 
(35, '+', 53, '=', 88) 
(44, '+', 44, '=', 88) 
... 

도움all에 :

>>> all? 
Type:  builtin_function_or_method 
String Form:<built-in function all> 
Namespace: Python builtin 
Docstring: 
all(iterable) -> bool 

Return True if bool(x) is True for all values x in the iterable. 
If the iterable is empty, return True. 
+0

이 작업은 가능하지만 내 문제는 내가 아직 신경 쓰지 않은 문제의 다른 부분입니다. 반대 숫자가 0으로 시작하면 문제를 계산하지 않아도됩니다. – Scott

+0

IE : 100이 001로 바뀌고 허용되지 않습니다. 360은 036으로 바뀌며, 우리는 이것을 계산하고 싶지 않습니다. 우리의 문제는 여기에 있습니다 : http://projecteuler.net/problem=145 – Scott

0

범위가 range(0, len(str(numb))) 일 때 빈 문자열로 시작됩니다.

def allEvenDigits(numb): 
    hasEvenNumb = True 
    for char in str(numb): 
     if int(char) % 2 == 0: 
      hasEvenNumb = False 
      break 
    return hasEvenNumb 

allEvenDigits(52) 

이 좀 더 간단하고, 검사 만듭니다 : 것 같다

def allEvenDigits(numb): # This is the issue one 
    hasEvenNumb = False; 
    for i in range(1, len(str(numb))): 
     if int(str(numb)[:i])%2 == 0: # if int of the string numb's char at i is even 
      hasEvenNumb = True; ## return that it is true 
      break; # why go on if we found a even. 
    return(hasEvenNumb); 

>>> allEvenDigits(52) 
False 

그러나 할 수있는 쉬운 일이 각 번호도 있는지 확인하는 것 : 당신은 그것을 해결할 수 부분 문자열이 아닌 개별 숫자 만.

+0

잘 어리석은 XD. 감사! – Scott

0
def sumrevers(x): 
    summation = x + int(str(x)[::-1]) 
    if summation % 2 != 0: return summation 


def checknum(x): 
    if not (str(x)[-1] == "0") or (str(x)[0] == "0"): 
     if type(sumrevers(x)) == int: 
      num = str(sumrevers(x)) 
      checklis = [k for k in str(num)] 
      if all(int(i) % 2 != 0 for i in checklis): return True 


cnt = 0 
for i in xrange(1, 1000000001): 
    if checknum(i): 
     cnt += 1 
print cnt