作者:翟天保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;

总结

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

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

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

  1. C语言计算贝祖算法,欧几里德算法及贝祖公式

    一.欧几里德算法 欧几里德算法是一个用来求两个整数的最大公约数的算法,他也叫辗转相除法.定理如下: gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0) gc ...

  2. 欧几里德算法与扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  3. 欧几里德算法 扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数. 计算公式:gcd(a,b) = gcd(b,a mod b). 算法实现: public static int g ...

  4. 欧几里德算法与扩展的欧几里德算法及乘法逆元

    欧几里德算法与扩展的欧几里德算法及乘法逆元 欧几里德算法 扩展的欧几里德算法 乘法逆元 以下提到的数都是整数. 欧几里德算法 欧几里德算法用于求解最大公倍数,也就是辗转相除法.其结论非常简洁,对任意整 ...

  5. 欧几里德和扩展欧几里德算法

    1.欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb ...

  6. 欧几里德算法(辗转相除法)

    欧几里德算法又称为辗转相除法,用于计算两个非负整数的最大公约数. template<typename T> T gcd(const T &a, const T &b) {r ...

  7. 【数论基础】欧几里德算法及其各种应用

    目录: 欧几里德算法(辗转相除法) 1.问题引入:线段上格点的个数 2.输入两个正整数,求最大公约数和最小公倍数 3.P1029 最大公约数和最小公倍数问题 欧几里德算法(辗转相除法) 辗转相除法, ...

  8. 欧几里德与扩展欧几里德算法——密码学笔记(五)

    一.欧几里德算法 又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a% ...

  9. poj 1061 (扩展欧几里德算法)

    首先先抛出一个例题:            青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 89761   Acc ...

最新文章

  1. html.textboxfor id,How to update the textbox value @Html.TextBoxFor(m = m.MvcGridModel.Rows[j].Id)
  2. 区域链实践第一步——区域链测试环境搭建
  3. A Faster Volatile
  4. 字典 学生成绩等级_python-列表及字典进阶
  5. V4L2学习(三)框架分析
  6. Python:[-1]、[:-1]、[::-1]、[n::-1] 原理大详解(超全超仔细!)
  7. POJ 2195 Going Home(最小费用最大流)题解
  8. p坚持csma协议 仿真‘_巧家快速推进移民生产安置人口界定和协议签订工作
  9. 按键精灵操作mysql数据库_按键精灵mysql数据库
  10. WTL 自绘控件库 (CQsCheckBox)
  11. dot com过时了,个性域名“钱”景看好
  12. bzoj 4987 Tree - dp
  13. Python 实现简单的客户端认证
  14. vue动态路由变化页面不重新加载问题,实现方式比较简单,就是有点鸡贼
  15. Java基础强化训练——开发工具及输出语句训练
  16. TreeSet()原理及使用
  17. php引入百度Ueditor富文本编辑器
  18. AWS RDS多可用区部署与只读副本的区别
  19. H5 集成微信自定义分享(兼容 ios android)
  20. 程序员经常看的开源月刊《HelloGitHub》第 56 期

热门文章

  1. PVE7.显示CPU和硬盘温度
  2. 如何将实时网页添加到PowerPoint演示文稿
  3. 转载 同龄人2016年的一篇博文 用来自励
  4. Appium+Python连接真机、跳过登录页、Unexpected error while obtaining UI hierarchy问题
  5. 什么是灵活的软件授权模式,如何选择软件加密狗?
  6. .NET Web Services服务
  7. torch.from_numpy()完成numpy到tensor数组的转换
  8. C语言枚举类型通常用来干嘛,C语言学习:枚举类型是什么?
  9. 【低压差稳压器(LDO)自制 Multisim仿真 + 详细参数说明】
  10. mysql的原子性是如何实现的?