欧几里得算法求解两个正整数的最大公约数。
设两个正整数a,b使得a≥b,则(a,b)的最大公约数gcd(a,b)为:
①a÷b = q1......r1 当r1=0时则gcd(a,b)为b;
若r1≠0则继续
②b÷r1=q2.....r2 当r2=0时 则gcd(a,b)为r1
若r2≠0则继续
③r1÷r2=q3......r3 当r3=0时 则gcd(a,b)为r2
若r3≠0则继续
................
................
直到第n次没有余数 则gcd(a,b)为这个除数
例如求解600,315的最大公约数
①600÷315 = 1......285
②315÷285 = 1.....30
③285÷30 = 9......15
④30÷15 = 2.....0
即600与315的最大公约数是15
算法正确性的证明:
设两个正整数a,b使得a≥b
设gcd(a,b)为p;
不妨令a = mp,b = np,即p为gcd(a,b)的最大公约数
设mp ÷ np = q2 ...... r;
设 u ÷ mp = q1 ...... np;
则 u = mp*q1 + np = (m*q1 + n)*p;
显然 p也是u的一个约数;
那p是否是 u与mp的最大公约数呢?
假设 u与mp的最大公约数不是p为d,即d>p;
不妨令 u = dx ,mp = dy,即假设u与mp的最大公约数为d;
则有dx ÷ dy = q1 ...... np;
则有np = dx - dy*q1 = (x - y*q1)*d ,显然有d也是np的一个约数;
则有 np/d <n,mp/d <m,显然n,m也不是最小的;
则有 这与 m,n是最小的两个互质数产生矛盾;
因而 假设不成立;
所以 p也是u与mp的最大公约数;
从而推导出 gcd(a,b) = gcd(b,mod(a,b)) ;这里mod(a,b)为a÷b的余数;
从而可以辗转继续循环此步骤 直到某次余数为0则最大公约数是这时的除数。
C++编写计算机程序实现
#include <iostream> //基本输入输出流
using namespace std; //使用std域
int gcd(int,int); //求解最大公约数函数声明
int main(int argc,char** argv)
{
cout<<gcd(600,315)<<endl;
return 0;
}
int gcd(int a,int b) //函数定义
{
if(!(a%b)) //递归终止条件两个数能够整除
return b;
else
return gcd(b,a%b); //递归
}
程序输出结果15。