C++ 两个以上数字的最小公倍数
我想找出两个以上数字的最小公倍数(LCM)。我知道lcm(a,b)=(a*b)/gcd(a,b)的公式。比方说,我有一个数字数组:[2,6,8,13],lcm应该是模M=100000007 我已经看到了下面的代码来计算多个数字的LCM,但我不理解这两个循环的计算是如何进行的C++ 两个以上数字的最小公倍数,c++,lcm,C++,Lcm,我想找出两个以上数字的最小公倍数(LCM)。我知道lcm(a,b)=(a*b)/gcd(a,b)的公式。比方说,我有一个数字数组:[2,6,8,13],lcm应该是模M=100000007 我已经看到了下面的代码来计算多个数字的LCM,但我不理解这两个循环的计算是如何进行的 int arr[] = {2, 6, 8, 13}, n = 4 long long int ans=1; long long int M=1000000007; for(int i=0;i<n;i++) // C
int arr[] = {2, 6, 8, 13}, n = 4
long long int ans=1;
long long int M=1000000007;
for(int i=0;i<n;i++) // Calculating LCM
{
for(int j=i+1;j<n;j++)
{
arr[j]=arr[j]/__gcd(arr[i],arr[j]);
}
ans=((ans%M)*(arr[i]%M))%M;
}
return (ans)%M;
intarr[]={2,6,8,13},n=4
长整型ans=1;
长整型M=100000007;
对于(int i=0;我知道gcd(a,b)
代表a
和b
共享的所有基本因子的乘积,a/gcd(a,b)
的意义是什么?
a/gcd(a,b)
等于a
中不在b
中的基本因子
因此,当你将该数量乘以b
,你会得到b
的所有素因子与a
的所有素因子的乘积,这些素因子不在b
中。这正是lcm(a,b)
让我们将其扩展到任意数量的整数。
lcm(a,b)
是a
乘以b
的所有基本因子,不在a
中,或者:
a * (b / gcd(a, b)) = (a * b) / gcd(a, b)
很简单,你已经知道了
但是如果我们有第三个数字,lcm(a,b,c)
是a
乘以b
的所有素因子,而不是a
乘以c
中a
和b
的所有素因子。好的,第一部分是直接的,它与上面相同:
lcm(a, b, c) = lcm(a, b) * (all the prime factors of c in neither a nor b)
如何计算a和b中c的所有素因子起初可能并不明显,但也不太复杂:
all the prime factors of c in neither a nor b = c / (gcd(a, c) * gcd(b, c))
也就是说
lcm(a, b, c) = lcm(a, b) * c / (gcd(a, c) * gcd(b, c))
lcm(a, b, c) = (a * b * c) / (gcd(a, b) * gcd(a, c) * gcd(b, c))
现在,您可以很容易地概括:
lcm(a[0], ..., a[N]) = prod(a[0], ..., a[N]) / pairwise_gcd(a[0], ..., a[N])
但更相关的公式是递归版本:
lcm(a[0], ..., a[N]) = lcm(a[0], ..., a[N-1]) * a[N] / (gcd(a[0], a[N]) * ... * gcd(a[N-1], a[N]))
或:
下面是将代码片段转换为伪代码的尝试
将其与数组上的lcm
的上一个定义进行比较,我试图使它们看起来相似
given int array = arrayOfNums
int product := 1
for number in arrayOfNums
remove all prime factors of number from all subsequent array elements
product = product * number
product is now the lcm of arrayOfNums
希望这不会太令人困惑;我承认这可能不是一个很好的解释,但这是一个起点。如果还有什么不清楚的地方,请告诉我。记住((a%b)*(c%b))%b=(a*c)可能会有所帮助%b
,它只是用这种方式来处理较小的数字。@Mxt,你能详细说明lcm计算部分吗?我了解MOD功能。但我需要了解lcm计算逻辑。当然,我会尝试写一个答案,这部分让我困惑了一秒钟,所以我认为解释可能会有所帮助。我我已经完成了我的答案的格式设置,如果有什么不清楚的地方,或者我有没有遗漏,请告诉我!谢谢@Mxt。你的答案很有意义。
given int array = arrayOfNums
int product := 1
for number in arrayOfNums
remove all prime factors of number from all subsequent array elements
product = product * number
product is now the lcm of arrayOfNums