LCM 和 GCD 3 编号 - Python
LCM and GCD 3 Number - Python
到目前为止,这是我的代码。
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)))
我的问题是 3 位数字只是找到一个公倍数,而不是最小的 10 、 5 、 8 使 400 而不是可能的 40。
任何帮助都会有用!
New Code Thanks To 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):
gcd2 = gcd(y, z)
gcd3 = gcd(x, gcd2)
lcm2 = y*z // gcd2
lcm3 = x*lcm2 // gcd(x, lcm2)
return lcm3
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)))
另外一件事,是否有另一种标记代码的方法,而不是必须在每一行之前添加 4 个空格。谢谢
分析
正如您刚刚发现(但尚未意识到)的那样,适用于整数对的关系:
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
要计算两个以上数字的 GCD,您可以按如下方式计算:
例如:a、b、c、[=60=的GCD ]d
- gcd(a, b) = x
- gcd(x, c) = y
- gcd(y, d) = z
要计算两个以上数字的LCM,您可以按如下方式计算:
例如:a、b、c、[=60=的LCM ]d
- a * b // gcd(a, b ) = x
- x * c // gcd(x, c ) = y
- y * d // gcd(y, d ) = z
*用于 "floor" 除法的双斜杠运算符 (//)(向下舍入到最接近的整数).
GCD 在 Python 3:
所以首先我们可以通过以下简单的 while
迭代和使用 gcd() function from 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 function and using reduce() function from 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)
无论哪种方式 return 都是一样的。通过这个简单的函数,你可以计算出你想要的所有数字的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 Python 3:
遵循上述最简单示例的相同原理,计算两个或多个数字的 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
希望对你有帮助,对我来说效果很好。
到目前为止,这是我的代码。
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)))
我的问题是 3 位数字只是找到一个公倍数,而不是最小的 10 、 5 、 8 使 400 而不是可能的 40。 任何帮助都会有用!
New Code Thanks To 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):
gcd2 = gcd(y, z)
gcd3 = gcd(x, gcd2)
lcm2 = y*z // gcd2
lcm3 = x*lcm2 // gcd(x, lcm2)
return lcm3
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)))
另外一件事,是否有另一种标记代码的方法,而不是必须在每一行之前添加 4 个空格。谢谢
分析
正如您刚刚发现(但尚未意识到)的那样,适用于整数对的关系:
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
要计算两个以上数字的 GCD,您可以按如下方式计算:
例如:a、b、c、[=60=的GCD ]d
- gcd(a, b) = x
- gcd(x, c) = y
- gcd(y, d) = z
要计算两个以上数字的LCM,您可以按如下方式计算:
例如:a、b、c、[=60=的LCM ]d
- a * b // gcd(a, b ) = x
- x * c // gcd(x, c ) = y
- y * d // gcd(y, d ) = z
*用于 "floor" 除法的双斜杠运算符 (//)(向下舍入到最接近的整数).
GCD 在 Python 3:
所以首先我们可以通过以下简单的 while
迭代和使用 gcd() function from 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 function and using reduce() function from 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)
无论哪种方式 return 都是一样的。通过这个简单的函数,你可以计算出你想要的所有数字的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 Python 3:
遵循上述最简单示例的相同原理,计算两个或多个数字的 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
希望对你有帮助,对我来说效果很好。