作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
近期购买了一本《图解算法C++》,回顾复习下算法知识。正好借此机会,将我在复习过程中觉得不错或者容易忘记的算法整理下来,可能会帮助到其他想要学习的人。
本文介绍一种求解最大公约数常用的算法——欧几里德算法,以下是本篇文章正文内容,包括算法简介、原理及证明、算法流程和C++代码实现。
欧几里德算法又称辗转相除法,是求解最大公约数常用的一种算法。过程:假设有A和B两个值,A大于B,用其中较大的数A除以较小的数B,再将较小的数B除以得到的余数C(第一次除法所得),又得到一个余数D(第二次除法所得),如此类推,直到最后余数为0时终止该过程,最后的余数就是A和B的最大公约数。
两个数的最大公约数是可以同时整除这两个数的最大正整数。
设两个数为a、b(a≥b),求a和b最大公约数(Greatest common divisor)gcd(a,b)的步骤如下:
同样设两个数a和b(a≥b),gcd(a,b)表示两数的最大公约数,r=a mod b,r为a除以b的余数,k为a除以b的商,即a÷b=k......r。
欧几里德算法能求解最大公约数的原理其实就是证明gcd(a,b)=gcd(b,r),即a和b的最大公约数和b和r的最大公约数是一个。
证明过程如下:
欧几里德算法求解正整数a和b的最大公因数gcd(a,b),假设a≥b:
a除以b,若a mod b=0,则gcd(a,b)=b;否则gcd(a,b)=gcd(b,a mod b),递归或循环运算得结果。
算法流程图如下:
// 欧几里德C++实现伪代码
if ( num1 < num2 )
{
temp = num1;
num1 = num2;
num2 = temp;
}
// 确保num2是较小值,num1是较大值
while ( num2 != 0 ) // 欧几里德算法过程,直到num2(余数)为0时结束循环过程
{
temp = num1 % num2; // 计算余数
num1 = num2;
num2 = temp; // 将余数作为下一轮的除数
}
std::cout<<"最大公约数为:"<
以上就是本文所讲的内容,简单介绍了欧几里德算法的原理和实现。