2015-11-23 9 views
-1

код для запуска наименьший делитель:Я не могу понять, почему следующий код мне не дает?

def smallesteuler(): 
    t=0 
    result=[] 
    for no in range(11,10000): 
     for i in range(1,11): 
      if (no%i==0): 
       t=t+1 
      if(t==20): 
       return result.append(no) 
     t=0 
print (smallesteuler()) 
+0

'list.append()' return 'None'. –

+0

Вы возвращаете результат 'append()', который всегда 'None'. – TigerhawkT3

ответ

0

Похоже, вы пытаетесь собрать первые 20 чисел, которые удовлетворяют no%i==0. Вам придется добавить эти цифры в result, а затем return result.

def smallesteuler(): 
    t=0 
    result=[] 
    for no in range(11,10000): 
     for i in range(1,11): 
      if (no%i==0): 
       result.append(no) 
       t=t+1 
      if(t==20): 
       return result 

print (smallesteuler()) 
1

Это похоже на проблему Эйлера 5 - найти наименее распространенный кратный 1..20.

Ваш код можно переписать в виде

def euler5(upto=20): 
    """ 
    Find the least common multiple of 1..upto 
    """ 
    num = upto 
    while True: 
     if all(num % factor == 0 for factor in range(2, upto+1)): 
      return num 
     else: 
      num += 1 

однако гораздо более эффективным решением было бы

from fractions import gcd 
from functools import reduce 

def lcm(a, b): 
    return a * b // gcd(a, b) 

def euler5(upto=20): 
    return reduce(lcm, range(1, upto+1)) 

Первое решение O (п!), Во-вторых, O (п ** 2).