定理:Gcd(m,n)=Gcd(n,m mod n)
证明:对于任何正整数a,b。如果a>b,都有a=k*b+r 即r=a-k*b => r=a mod b.
假设d为a,b的公约数,则a=a1*d,b=b1*d。
而r=a1*d-k*b1*d=(a1-k*b1)*d => d也是r的约数 => d也是(a,r)的公约数
则说明(a,b)的公约数也就是(b,r)的公约数。因此gcd(a,b)=gcd(b,a mod b)。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int Gcd(int m,int n)
{
int temp;
while(n){//若m<n,第一次循环把m,n交换
temp=m%n;
m=n;
n=temp;
}
return m;
}
int main(){
int m,n;
while(cin>>m>>n)
cout<<Gcd(m,n);
return 0;
}
另外:两个数a,b的最大公倍数为a*b/Gcd(a,b)
另一种求最大公约数的方法:辗转相减法
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int Gcd(int m,int n)
{
int temp;
if(m<n)
swap(m,n);
while(n){
if(m<n)
swap(m,n);
temp=m-n;
m=n;
n=temp;
}
return m;
}
int main(){
int m,n;
while(cin>>m>>n)
cout<<Gcd(m,n)<<'\n';
return 0;
}