最大公约数 GCD

头文件: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;
}

题目:洛谷p1029

猜你喜欢

转载自blog.csdn.net/zhimeng_LQ/article/details/108169148