头文件:algorithm
偷懒版本
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
cout<<"最大公约数:"<<__gcd(n,m);
return 0;
}
gcd内部原理
//裸的_gcd(a,b);
int gcd(int n,int m){
return (!m)?n:gcd(m,n-m);
}
__gcd(i,j)是求最大公约数,i*j/__gcd(i,j)是求最小公倍数。
gcd的优化
当a和b非常大时,%操作效率较低。所以可以用减法优化,大的减去小的。
但是减法万一遇到这种情况__gcd(9999,1);
那么时间复杂度就非常大。
我们发现了一个新特性,当a b都为偶数的时候,可以提取出一个2。gcd(6,2) = 2*gcd(3,1);
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int n,int m){
return (!m)?n:gcd(m,n-m);
}
int gcd_sub(int n,int m){
//大数处理 用减法优化
if(m>n)return gcd_sub(m,n);
return (!m)?n:gcd_sub(m,n-m);
}
int gcd_mix(int n,int m){
//偶数优化
if(m>n)return gcd_mix(m,n);
if(m==0)return n;
if(n%2==0){
if(m%2==0)return 2*gcd_mix(n>>1,m>>1);
else return gcd_mix(n>>1,m);
}else{
if(m%2==0)return gcd_mix(n,m>>1);
else return gcd_mix(m,n-m);
}
}
int main()
{
int a,n,m;
cin>>n>>m;
a = gcd(n,m);
a = gcd_sub(n,m);
a = gcd_mix(n,m);
printf("最大公约数:%d",a);
return 0;
}