Top4——暴力枚举
代码如下
#include<bits/stdc++.h>
using namespace std;
signed main(){
int a,b;
cin>>a>>b;
for(int i=min(a,b);i>0;i--){
if(a%i==0 && b%i==0){
cout<<i<<endl;
break;
}
}
return 0;
}
思路很简单,但时间与其成反比——最坏O(min(a ,b));
Top3——短除法
对,你没听错。用分解质因数的方法,将重复的去掉后剩下相乘。
代码如下:
#include<bits/stdc++.h>
using namespace std;
signed main(){
int a,b,gcd=1;
cin>>a>>b;
for(int i=2;i*i<min(a,b);i++){
while(a%i==0 && b%i==0)
{
a/=i;
b/=i;
gcd*=i;
}
while(a%i==0){
a/=i;
}
while(b%i==0){
b/=i;
}
}
if(a%b==0){//防止没除尽
gcd*=b;
}else{
if(b%a==0){
gcd*=a;
}
}
cout<<gcd<<endl;
return 0;
}
时间复杂度O(sqrt(min(a,b)))
但还是不快,是吧。
Top2——更相减损术
出自《九章算术》,算法简洁。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(a==b){
return a;
}
if(a<b){
swap(a,b);
}
return gcd(b,a-b);
}
signed main(){
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}
速度很快:gcd(a,b)=gcd( b,a%b),但似乎还不够快。
接下来 “老大”出场——
Top1——欧几里得算法
代码如下——
#include<bits/stdc++.h>
using namespace std;
int a,b;
int gcd(int a,int b){
if(b==0){
return a;
}
return gcd(b,a%b);
}
signed main(){
cin>>a>>b;
cout<<gcd(a,b)<<endl;
}
非常高效,时间复杂度甚至离谱————O(logN)
隐藏算法
其实,c++自带gcd函数.....................
#include<bits/stdc++.h>
using namespace std;
int a,b;
signed main(){
cin>>a>>b;
cout<<__gcd(a,b)<<endl;
}
想不到吧哈哈......
申明:
由于要开学了,我不一定可以在短期内连续发文了,请各位爱粉们原谅