1.枚举法
从min(a,b)到1枚举,判断,复杂度O(min(a,b))
2.分解素因数
int Decompose(int a,int b){
int ans = 1;
for(int x = 2; x * x <= min(a,b); x++){
while(a % x == 0 && b % x == 0){
a /= x;b /= x;ans *= x;}
while(a % x == 0) a /= x;
while(b % x == 0) b /= x;
}
if(a % b == 0) ans *= b;
else if(b % a == 0) ans *= a;
return ans;
}
3.欧几里得算法(辗转相除法)
int gcd(int a,int b){
if (b == 0) return a;
else return gcd(b,a % b);
}
时间复杂度O(log(a+b))
4.高精度gcd(更相减损术)
不妨设a<=b,则有:
1.a=b时, gcd(a,b)=a;
2.a,b均为偶数时,gcd(a,b)=2*gcd(a/2,b/2);
3.a为偶,b为奇时,gcd(a,b)=gcd(a/2,b);
4.a为奇,b为偶时,gcd(a,b)=gcd(a,b/2);
5.a,b均为奇数时,gcd(a,b)=gcd(a-b,b);
例题
#include<bits/stdc++.h>
#define str strlen
#define ll long long
using namespace std;
struct huge{
int num[10010]