在Python中计算给定数字列表的LCM

问题描述 投票:5回答:12

我编写了一个代码来查找数字列表的LCM(最低公倍数)但我的代码中似乎有错误。代码如下:

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]))

请原谅我糟糕的变量选择,请求您查看逻辑是否正确以及代码是否正常运行。

我得到的语法错误是“因素”是无效的语法,虽然我不同意这一点。请告诉我我的代码出错了。

python
12个回答
16
投票

这是我所知道的最佳方式:

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
投票

math包含gcd功能。几个数字的最低公倍数是迭代的最低公倍数,因此我们可以使用functools.reduce。注意我将1作为第三个参数传递给reduce。这允许llcm处理a为空的琐碎案例。

def lcm(a, b):
    "Lowest common multiple"
    import math as m
    return a * b // m.gcd(a, b)

def ilcm(a):
    "Iterated lowest common multiple"
    import functools as f
    return f.reduce(lcm, a, 1)

assert ilcm([]) == 1
assert ilcm([0]) == 0
assert ilcm([2, 3, 4, 5]) == 60
assert ilcm([0, 2, 3, 4, 5]) == 0

0
投票

这是我计算GCD和LCM的答案。请试一试。我能做的最简单。

import math
GCF = yourlist[0]
LCM = yourlist[0]
for i in yourlist[1:]:
    GCF = math.gcd(GCF, i)
LCM = LCM*i//math.gcd(LCM, i)
print(GCF)
print(LCM)

0
投票

如果你不想使用GCD算法,下面的代码返回最大数量的数组的最小倍数:

            a=[5,10,15,7]
            ctr=1
            LCM=max(a)
            remList=[LCM%i for i in a]
            if all(v == 0 for v in remList):
                    print("LCM is : ", max(a))
            else:
                while True:
                    remList=[LCM%i for i in a]
                    if all(v == 0 for v in remList):
                        print("LCM is : ",LCM)
                        break
                    else:
                       LCM=LCM+max(a)

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)

3
投票
from math import gcd 
#from fractions import gcd # If python version is below 3.5
from functools import reduce # Needed for Python3.x

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

或者不使用gcd(这基本上将this solution压缩成一行):

from functools import reduce # Needed for Python3.x

def lcm(denominators):
    return reduce(lambda x,y: (lambda a,b: next(i for i in range(max(a,b),a*b+1) if i%a==0 and i%b==0))(x,y), denominators)

2
投票

查找给定数字列表的LCM

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)

1
投票

你在第三行中缺少一个闭括号(')')。因此线因素的误差。

此外,在第一个函数的最后一行,您已命名变量

factors as factor

改变这一点。


1
投票

不使用任何数学函数的更快方法是计算GCD并计算LCM。

def gcd(a,b):
    while b:
        a,b = b, a%b
    return a

现在使用GCF找到LCM

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

将其扩展为使用列表,如下所示

LCM = functools.reduce(lambda x, y: lcm(x, y), your_list_to_find_lcm)

0
投票
c=1
i=0
q=0
j=2;
flag=0;
count=0;
a=input("ente 3 no")


a=a.split(',')
print(len(a))
for i in range(len(a)):
    z=int(a[i])
    c=c*z

while(j<c):
 for p in range(len(a)):

   if(j%int(a[p])==0):
       count=count+1

       if(count==len(a)):
           print('in count counter',count)    
           print('in count',j)        
           flag=1
           break
       else:

           flag=0
   else:
       break
 if(flag==1):
      print('flag',j)        
      break
 else:
           count=0
           j=j+1    

print(j)enter code here
print("count",count)

0
投票

查找数字列表的LCM和GCD

阅读完所有这些解决方案后仍然不清楚,这是我可能最简单的方法:)

使用GCD找到LCM

from fractions import gcd
from functools import reduce
a = [2,4] #given list
def LCM(a, b):
    return (a*b)//gcd(a,b) # as LCM(a,b)*GCD(a,b) = a*b
lcm = reduce(LCM, a) #here reduce will iterate through all 
                     #the elements one by one
gcd = reduce(gcd, a)

print(lcm, gcd)

OUTPUT:

4 2

0
投票

在Numpy v1.17(写作时,非发布开发版本)中有一个lcm函数,可以用于两个数字,例如:

import numpy as np
np.lcm(12, 20)

或多个数字,例如:

np.lcm.reduce([40, 12, 20])

还有一个gcd功能。

© www.soinside.com 2019 - 2024. All rights reserved.