求最大公约数有多种方法,常见的有:
- 质因数分解法:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约 数。把几个数先分别分解质因数,再把各数中的全部公有的质因数和独有的质因数提取出来连乘,所得的积就是这几个数的最小公倍数。
- 短除法:短除法求最大公约数,先用这几个数的公约数连续去除,一直除到所有的商互质为止,然后把所有的除数连乘起来,所得的积就是这几个数的最大公约数。短除法求最小公倍数,先用这几个数的公约数去除每个数,再用部分数的公约数去除,并把不能整除的数移下来,一直除到所有的商中每两个数都是互质的为止,然后把所有的除数和商连乘起来,所得的积就是这几个数的最小公倍数
- 辗转相除法点击打开链接
- 更相减损法点击打开链接
辗转相除法代码C++
int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a%b);
}
上面的和下面的一样,形式不同
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
if(a<b)swap(a,b);
return b==0?a:gcd(b,a%b);
}
int main()
{
int m,n;
cin>>m>>n;
cout<<gcd(m,n)<<" "<<m*n/gcd(m,n)<<endl; //最大公约数和最小公倍数
}
懒得写gcd的话用algorithm里面的__gcd
如
#include <iostream>
#include<algorithm>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
cout<<__gcd(n,m)<<endl;
return 0;
}
辗转相除法代码C
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
int m=a,n=b;
if(m<n)swap(m,n);
while(n!=0)
{
int t;
t=n;
n=m%n;
m=t;
}
cout<<m<<endl;
cout<<a*b/m<<endl;
}
更相减损术C
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
while(a!=b)
{
if(a>b)a-=b;
else b-=a;
}
return a;
}
int main()
{
int m,n;
cin>>m>>n;
cout<<gcd(m,n)<<" "<<m*n/gcd(m,n)<<endl;
}
其他的以后慢更......................................................................................