到目前为止,这是我的代码。
mprintf
我的问题是3位数只是找到一个共同的倍数而不是最低的这样的10,5,8使得400而不是40。 任何帮助都会有用!
感谢Prune的新代码
from math import gcd
#3 digit lcm calculation
h=input("(1) 2 Digit LCM Or \n(2) 3 Digit LCM\n :")
if h == "2":
while True:
def lcm(x, y, z):
a = gcd(x, y, z)
num = x
num2 = y * z // a
LCM = num * num2 // a
return LCM
x = int(input("Number 1: "))
y = int(input("Number 2: "))
z = int(input("Number 3: "))
print("The LCM Of " + str(x) + " And " + str(y) + " And " + str(z) + " Is " + str(lcm(x, y, z)))
if h == "1":
while True:
def lcm(x, y):
a = gcd(x, y)
num = x
num2 = y
LCM = num * num2 // a
return LCM
x = int(input("Number 1: "))
y = int(input("Number 2: "))
print("The LCM Of " + str(x) + " And " + str(y) + " Is " + str(lcm(x, y)))
还有一件事,是否有另一种标记代码的方法,而不必在每一行之前添加4个空格。感谢
答案 0 :(得分:1)
<强>分析强>
正如您刚刚发现(但尚未实现),对于整数对的关系:
x * y = GCD(x,y)* LCM(x,y)
不保留三元组。素数因子分解的基本逻辑是GCD取每个素因子的最小指数; LCD采用最大指数。只有两个整数,这意味着每个指数只使用一次,允许上面的等式保持。
但是,对于三个整数,您可以保证每个素数因子的中间指数都将从LCM和GCD计算中排除。
10 = 2^1 * 3^0 * 5^1
8 = 2^3 * 3^0 * 5^0
5 = 2^0 * 3^0 * 5^1
----------------------
GCD = 2^0 * 3^0 * 5^0
LCM = 2^3 * 3^0 * 5^1
请注意排除的因素: 2 ^ 1 * 3 ^ 0 * 5 ^ 1 = 10 ,这就是您的LCM计算高达10倍的原因。
<强>解强>
使用第三个整数时需要拆分逻辑,如下所示:
# Find the 2-number and 3-number GCDs
gcd2 = gcd(y, z)
gcd3 = gcd(x, gcd2)
# Find the 2-number and 3-number LCMs
lcm2 = y*z // gcd2
lcm3 = x*lcm2 // gcd(x, lcm2)
return lcm3
答案 1 :(得分:0)
要计算两个以上数字的 GCD ,您可以按照以下步骤进行操作:
例如: a , b , c , d
的GCD要计算两个以上数字的 LCM ,您可以按以下步骤进行操作:
例如: a , b , c , d
* “底”除的双斜杠运算符(//)(四舍五入到最接近的整数)。
因此,我们首先可以通过以下简单的while
迭代并使用gcd()模块中的math函数,如下所示:
from math import gcd
def gcd_n(*args):
i = 1
x = args[0]
while i < len(args):
x = gcd(x, args[i])
i += 1
return x
还可以使用lambda函数并使用reduce()模块中的functools函数来简化它,如下所示:
from math import gcd
from functools import reduce
def gcd_n(*args):
f = lambda a,b:gcd(a,b)
return reduce(lambda x,y:f(x,y),args)
但是,当您认为无法简化它的时候……是的,它甚至可以变得更加简单:
from math import gcd
from functools import reduce
def gcd_n(*args):
return reduce(gcd, args)
无论哪种方式,收益都是相同的。使用此简单功能,您可以计算所需的所有数字的GCD,无论它们是2、3、4还是N个数字。
>>> gcd_n(3355, 985)
5
>>> gcd_n(3465, 6615, 7875)
315
>>> gcd_n(6930, 13230, 15760)
10
>>> gcd_n(1750, 1960, 3080)
70
>>> gcd_n(85, 96, 100, 225)
1
按照与上面最简单的示例相同的原理,要计算两个或多个数字的LCM,这两个函数就足够了:
from math import gcd
from functools import reduce
def lcm(a, b):
return a * b // gcd(a, b)
def lcm_n(*args):
return reduce(lcm, args)
这里有一个样本测试系列:
>>> lcm_n(77, 9)
693
>>> lcm_n(5, 10, 15)
30
>>> lcm_n(62, 89, 13)
71734
>>> lcm_n(21, 4, 17, 2)
1428
我希望它能对我有帮助。