我编写了一个代码来查找数字列表的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]))
请原谅我糟糕的变量选择,请求您查看逻辑是否正确以及代码是否正常运行。
我得到的语法错误是“因素”是无效的语法,虽然我不同意这一点。请告诉我我的代码出错了。
这是我所知道的最佳方式:
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
希望这可以帮助。欢迎所有查询,贡献和评论:)
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
这是我计算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)
如果你不想使用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)
你的解决方案可能太冗长了......试试吧!
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)
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)
查找给定数字列表的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)
你在第三行中缺少一个闭括号(')')。因此线因素的误差。
此外,在第一个函数的最后一行,您已命名变量
factors as factor
改变这一点。
不使用任何数学函数的更快方法是计算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)
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)
查找数字列表的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