穷举
从小到大
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,g=0;
cin>>a>>b;
for(int i=1;i<=(a<b?a:b);i++)
if(a%i==0 && b%i==0)
g=i;
cout<<g;
return 0;
}
从大到小
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,g=0;
cin>>a>>b;
for(int i=(a<b?a:b)=1;i>0;i--)
if(a%i==0 && b%i==0){
g=i;
break;
}
cout<<g;
return 0;
}
辗转相除
原理: g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)
证明:
假设g为a、b的最大公约数
则有
a
=
k
1
g
b
=
k
2
g
a=k _1g \space\space\space\space\space\space\space\space b=k_2g
a=k1g b=k2g
设a、b的余数为 r
则
r
=
a
−
k
3
b
=
k
1
g
−
k
2
k
3
g
=
g
∗
(
k
1
−
k
2
k
3
)
r=a-k_3b=k _1g-k_2k_3g=g*(k_1-k_2k_3)
r=a−k3b=k1g−k2k3g=g∗(k1−k2k3)
则 r 为 g 的倍数
int gcd(int a,int b){
if(b==0)
return a;
else
return gcd(b,a%b);
}