C++ 两个以上数字的最小公倍数

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

我想找出两个以上数字的最小公倍数(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++)   // 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