2013-05-11 3 views
0

Мой вопрос сегодня, если я иду по правильному пути для Эйлера 145, и если он сорта бывают эффективными. У меня большая часть этого, только одна из моих Defs дает мне проблемы с int (str (numb) [: 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 ase никогда не использовать ';' s в Python. В стороне посмотрите, что 'str (1234) [: 0]' равно –

+1

Кроме того, 'reverseed' - встроенная функция - вы не должны перезаписывать ее. – Volatility

ответ

1

Вы можете использовать встроенную функцию all() и использовать набор, чтобы сохранить трек чисел, которые были решены уже; например, если Вы решили 36, то нет никаких причин, чтобы решить 63:

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

Хотя это действительно работает, моя единственная проблема - это другая часть проблемы, которую я еще не пробовал, если обратное число начинается с 0s, мы не хотим их подсчитывать. – Scott

+0

IE: 100 переворачивается до 001, неприемлемо. 360 отменяет до 036, мы не хотим считать это. Наша проблема находится здесь: http://projecteuler.net/problem=145 – Scott

0

Вы начинаете с пустой строки, когда ваш диапазон равен range(0, len(str(numb))). Вы могли бы решить с:

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 

Представляется, однако, что проще всего сделать, было бы проверить, если каждое число четное:

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

allEvenDigits(52) 

делает его немного более простым, и чеки только отдельная цифра, а не подстрока.

+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