文章目录
简单求解“多数字(>=3)”最小公倍数&最大公因数(附核心代码模板)
相关知识
符号说明:GCD(Greatest Common Divisor),是最大公因数的英文缩写简称;同理,LCM(Least Common Multiple),是最小公倍数的英文缩写简称。
1、求两个数的最大公倍数
相关公式
由以上公式可知,对于已知的两个数A和B,要求他们的最大公因数和最小公倍数,由于A×B已知,我们只需要求出其中GCD或LCM其中的任意一个,即可将另外一个求出来。
所以现在的问题就变成了,怎么求这两者其中的任意一个呢?
相关函数
C++中有一个叫做==__gcd(A,B)
的内置函数,虽然名字中包含gcd,但其实并不是求GCD,而是求LCM的。这个函数已经被包括在万能头文件#include<bits/stdc++.h>
中,无需额外的声明。传入的数据类型应是整形。
有了这个求LCM的函数,我们就可以很迅速地求出来两个数的LCM,再利用2中的相关公式,即可求出两个数的GCD。GCD&LCM两数都搞定~~
2、求多个数(>2)的最大公倍数
如上图所示,求解思路就是递推求解。假设求x1到xn的GCD,根据以上思路,我们有以下代码。
GCD=1; //前面所有数的GCD,初值为1
for(int i=1;i<n;i++)GCD=GCD(前面所有数的GCD,x[i]); //递推更新GCD
3、GCD&LCM核心代码模板
本质上来说,两数的情况也是多数的一种,因此我们在这里给出的模板,依然按照更广泛、普适性更强的求多数的GCD这一问题来设计,如下所示:
gcd=1; // 目前前面所有数的GCD,初始值为1
for(int i=0;i<n;i++)gcd=gcd*x[i]/(__gcd(gcd,x[i])); // 利用GCD公式,不断目前前面所有数的更新GCD
cout<<gcd<<endl; // 最后更新的GCD,即为前n个数的GCD
相关题目
1、求两数的最小公倍数
参考思路
先利用==__gcd(A,B)
==求出LCM,再利用
参考AC代码
本题的参考代码本身就可以作为代码模板,如下所示。
#include<bits/stdc++.h>
using namespace std;
int main(){
int A,B;
while(cin>>A>>B){
cout<<A*B/(__gcd(A,B))<<endl;
}
return 0;
}
2、求多数(>2)的最小公倍数
参考思路
先求前2个数的gcd,再求前3个数的gcd,以此类推,最终即可求出前n个数的gcd。
参考AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll A,B,x[35],t,c,gcd;
cin>>t;
while(t--){
cin>>c;
memset(x,0,sizeof(x));
for(int i=0;i<c;i++)cin>>x[i];
gcd=1;
for(int i=0;i<c;i++)gcd=gcd*x[i]/(__gcd(gcd,x[i]));
cout<<gcd<<endl;
}
return 0;
}