欧几里德求最大公约数(辗转相除法)

来源:互联网 发布:capvision凯盛 知乎 编辑:程序博客网 时间:2024/04/30 03:07

定理: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;}





1 0