2016-05-15 5 views
2

Я написал код, чтобы узнать LCM (Lowest Common Multiple) списка номеров, но в моем коде есть ошибка. Код приведен ниже:Вычислить LCM списка заданных чисел в Python

def final_lcm(thelist): 
    previous_thelist = thelist 
    prime_thelist = list(set(thelist) - set(returns_new_thelist(previous_thelist)) 
    factors = 1 
    for i in prime_thelist: 
     factors = factors*i 
    new_thelist = returns_new_thelist(previous_thelist) 
    for i in range(1, 10000000000): 
     s_empty = [] 
     for j in new_thelist: 
      if i % j == 0: 
       s_empty.append(True) 
     if len(new_thelist) == len(s_empty): 
      initial_lcm = i 
      break 
    final_lcm = factor*initial_lcm 
    return final_lcm 



def returns_new_thelist(ll): 
    if 3 in ll: 
     ll.remove(3) 
    for i in ll: 
     if checks_if_prime(i) == True: 
      ll.remove(i) 
    return ll  

def checks_if_prime(n): 
    if n == 2: 
    return True 
    import math 
    for i in range(math.ceil(0.5*n), 1, -1): 
     if n % i == 0: 
      return False 
     elif i == 2: 
      return True 

print(final_lcm([1,2,3,4,5,6,7,8,9])) 

Пожалуйста, простите мой плохой выбор переменных, я прошу вас, чтобы увидеть, если логика верна и что код работает.

Синтаксическая ошибка, которую я получаю, это , что «факторы» являются недопустимым синтаксисом, хотя я не согласен с этим. Скажите, пожалуйста, где мой код неправильный.

+2

Вы должны смотреть в алгоритм Евклида: вычисления МДК с помощью простые факторизации излишне медленны и сложны. –

+0

prime_thelist = list (set (thelist) - set (returns_new_thelist (previous_thelist)) - отсутствует скобка для списка (..). Prime_thelist = list (set (thelist) - set (returns_new_thelist (previous_thelist))) –

ответ

1

В третьей строке отсутствует закрытая скобка (')'). Следовательно, ошибка в линейных факторах.

Кроме того, в последней строке второй части первой функции, у вас по имени переменной

factors as factor 

изменения, которые тоже.

5

Ваше решение может быть слишком длительным ... Попробуйте это!

from functools import reduce # need this line if you're using Python3.x 

def lcm(a, b): 
    if a > b: 
     greater = a 
    else: 
     greater = b 

    while True: 
     if greater % a == 0 and greater % b == 0: 
      lcm = greater 
      break 
     greater += 1 

    return lcm 

def get_lcm_for(your_list): 
    return reduce(lambda x, y: lcm(x, y), your_list) 

ans = get_lcm_for([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
print(ans) 
+0

Сэр, не могли бы вы направить правильное руководство по использованию этой лямбда-функции? –

6

Это лучший способ, который я знаю:

from math import gcd 
a = [100, 200, 150] #will work for an int array of any length 
lcm = a[0] 
for i in a[1:]: 
    lcm = lcm*i/gcd(lcm, i) 
print lcm 
+0

Я думаю, что вы в конечном итоге используете [0] дважды таким образом. Может инициализировать lcm = 1. –

+0

да спасибо. –

2

Чтобы найти НОК данного списка чисел

def findDivisor(num): 
    # 2,3 are the most common divisor for many numbers hence I go by divisor of 2,3 
    # if not then by the same number as divisor 
    if num%2 == 0: 
     return 2 
    elif num%3==0: 
     return 3 
    return num 

def findLCM(lcmArray): 
    lcm = 1 
    while len(lcmArray) > 0: 
     minOfLCMArray = min(lcmArray) 
     divisor = findDivisor(minOfLCMArray)   

     for x in xrange(0, len(lcmArray)): 
      Quotient = lcmArray[x]/divisor 
      Reminder = lcmArray[x]%divisor 
      if Reminder == 0: 
       lcmArray[x] = Quotient 

     lcm*=divisor 
     minOfLCMArray = min(lcmArray) 
     if minOfLCMArray == 1: 
      lcmArray.remove(minOfLCMArray) 
    return lcm 

lcmArray = map(int, raw_input().split()) 
print findLCM(lcmArray) 
Смежные вопросы