ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

基本算法-欧几里德算法(辗转相除法)

2021-04-20 09:31:59  阅读:287  来源: 互联网

标签:gcd num2 欧几里德 最大公约数 算法 余数 除法


作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

 

前言

近期购买了一本《图解算法C++》,回顾复习下算法知识。正好借此机会,将我在复习过程中觉得不错或者容易忘记的算法整理下来,可能会帮助到其他想要学习的人。

本文介绍一种求解最大公约数常用的算法——欧几里德算法,以下是本篇文章正文内容,包括算法简介、原理及证明、算法流程和C++代码实现。

 

一、欧几里德算法简介

欧几里德算法又称辗转相除法,是求解最大公约数常用的一种算法。过程:假设有A和B两个值,A大于B,用其中较大的数A除以较小的数B,再将较小的数B除以得到的余数C(第一次除法所得),又得到一个余数D(第二次除法所得),如此类推,直到最后余数为0时终止该过程,最后的余数就是A和B的最大公约数。

 

二、基本原理及证明

1.基本原理

两个数的最大公约数是可以同时整除这两个数的最大正整数。 

设两个数为a、b(a≥b),求a和b最大公约数(Greatest common divisor)gcd(a,b)的步骤如下:

  1. a除以b,得a÷b=q........r1(r1≥0),r1为第一次的余数;
  2. 若r1=0,则gcd(a,b)=b;
  3. 若r1≠0,再用b除以r1,得余数r2;
  4. 如此反复,直到某余数等于0,则该余数就是我们所找的最大公约数gcd(a,b)。

2.证明

同样设两个数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的最大公约数是一个。

证明过程如下:

  1. 令c=gcd(a,b),设a=mc,b=nc;
  2. 由a÷b=k......r可得r=a-kb=mc-knc=(m-kn)c;
  3. 第二步不难看出,c也是r的因数;
  4. 列出b=nc和r=(m-kn)c,如果n和m-kn互质,即两者公约数只有1,则表明c是b和r的最大公约数,后续证明n和m-kn互质;
  5. 假设m-kn和n不是互质,两者有一非零的最大公约数d,且d>1;
  6. 则有m-kn=xd,n=yd,得m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,则a与b的一个公约数cd>c,故c不是a与b的最大公约数,这与前面提到的c是a与b的最大公约数假设矛盾;
  7. 故m-kn和n为互质,即c是b和r的最大公约数,且是a和b的最大公约数,得证。

 

三、算法描述及流程图

欧几里德算法求解正整数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++代码实现

// 欧几里德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<<"最大公约数为:"<<num1<<std::endl;

总结

以上就是本文所讲的内容,简单介绍了欧几里德算法的原理和实现。

标签:gcd,num2,欧几里德,最大公约数,算法,余数,除法
来源: https://blog.csdn.net/zhaitianbao/article/details/115889843

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有