1.算法描述

使用Euclid算法编写递归函数求两个正整数A.B的最大公约数(GCD,Greatest Common Divisor):

  • 如果A能整除B,则最大公约数是B.
  • 否则,最大公约数等于B和A%B的最大公约数。

2.算法证明

Euclid算法用公式可以表示为:
GCD(A,B)=GCD(B,A%B)GCD(A,B)=GCD(B,A\%B)GCD(A,B)=GCD(B,A%B)
首先我们先弄清楚几个基本概念:

  • 对于整数 A,B,若存在整数 k,使得A=B∗kA=B*kA=B∗k,则称B被A整除。
  • 若A无法整除B,则A=B∗n+RA=B*n+RA=B∗n+R(R为余数)。

下面进行证明:
假设存在一个整数x,x是A和B的公约数,则:

  • A=a∗xA=a*xA=a∗x
  • B=b∗xB=b*xB=b∗x

那么就可以得到:

  • A=B∗n+RA=B*n+RA=B∗n+R
  • a∗x=b∗x∗n+Ra*x=b*x*n+Ra∗x=b∗x∗n+R (R为余数,n为A/B的整数结果)
  • R=a∗x−b∗x∗nR=a*x-b*x*nR=a∗x−b∗x∗n

提取公因式:

  • R=x∗(a−b∗n)R=x*(a-b*n)R=x∗(a−b∗n)

得到结论,x不仅是A,B的公约数,也是R的公约数,所以GCD(A,B)=GCD(B,A%B)GCD(A,B)=GCD(B,A\%B)GCD(A,B)=GCD(B,A%B)成立。

数字A和B的最大公约数会等于数字B和之前余数(R)的最大公约数,且以此类推:
那我们用GCD公式实验一下:
GCD (4851, 840) = GCD (840, 651) 4851 / 840 = 5(余651)
GCD (840, 651) = GCD (651, 189) 840 / 651 = 1(余189)
GCD (651, 189) = GCD (189, 84) 651 / 189 = 3(余84)
GCD (189, 84) = GCD (84, 21) 189 /84 = 2(余21)
GCD (84, 21) = 21 84/21 = 4(余0)
结果:4851,840的最大公约数是21。

3.算法代码

代码如下:

#include<stdio.h>
// Euclid 递归函数
int GCD(int A,int B){//base caseif(A%B == 0)return B;//elsereturn GCD(B,A%B);
}int main(void){printf("4851和840的最大公约数是%d\n",GCD(4851,840));return 0;
}

结果如下:

Euclid 欧几里得算法(c语言递归版)相关推荐

  1. 欧几里得算法 C语言

    欧几里得算法是我在协会留的作业的总结,在这里总结一下. 所谓的欧几里得算法即求两个正整数的最大公约数的算法. 利用欧几里得算法编译程序可利用递归方法也可不用递归的方法, 欧几里得算法: #includ ...

  2. c语言递归法1 2 n,递归法_C语言递归法_递归算法经典实例(2)

    在网上搜索梵塔游戏fanta.exe,自己动手,体会梵塔问题,尝试解决问题. 3 问题分析 教师提出问题: 1. 盘子移动过程中的两个要求? 2. 寻找规律:(教师引导,学生描述移动过程) (1)两个 ...

  3. 欧几里得算法c语言实现代码,密码学 欧几里得算法

    Euclidean欧几里德算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数.应用领域有数学和计算机两个方面.计算公式gcd(a,b) = gcd(b,a mod b). 简介 欧几里德算 ...

  4. C语言:欧几里得算法求最大公约数

    文章目录 欧几里得算法 C语言:欧几里得算法求最大公约数 C语言:穷举法 欧几里得算法 举个例子说明欧几里得算法. 如图所示,用正方形地板砖,把这一块粉红色空地(长为xxx,宽为yyy,x>yx ...

  5. 数论:欧几里得与扩展欧几里得算法

    文章目录 欧几里得算法 历史发展 表示 证明 代码 例题 扩展欧几里得算法 表示 求解方法 代码 其他定理: 例题 欧几里得算法 历史发展 欧几里得算法用来求得两个数的最大公约数,大约公元前300年首 ...

  6. 欧几里得和扩展欧几里得算法

    欧几里得算法 又称为辗转相除法,c语言代码如下: 分析:a,b的关系可表示为a=kb+t, 即 a-kb=t, t=a%b, 假设c为a,b的一个公约数,将a-kb=t等式两边同除c, 得 a/c-k ...

  7. 扩展欧几里得算法证明及代码

    裴蜀定理: 存在两个正整数a,b,使得a * x + b * y = gcd( a , b ) 证明方法(扩展欧几里得算法): 1.当 b = 0 时gac( a , b ) = a易知 x = 1, ...

  8. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  9. 欧几里得  拓展欧几里得算法 讲解 (Euclid Extend- Euclid Algorithm)

    欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数.   ...

  10. 欧几里得算法求最大公约数之惊掉下巴的代码简化(纯C语言)

    欧几里得算法求最大公约数也叫辗转相除法. 证明 有两个数a,b,且a = kb + r(a,b,k,r皆为正整数,且r<b) 假设d为a,b的一个公约数 而r = a - kb,两边同时除以d, ...

最新文章

  1. python面试-Python面试题(整理)
  2. OpenCV示例学习(二): 基本图形绘制算子:line(),circle(),fillPoly(), ellipse()
  3. Gulp解决发布线上文件(CSS和JS)缓存问题
  4. zabbix批量操作
  5. 程序员入门编程,看这10本书,少走10年弯路
  6. php gmssl,golang gmssl编译不过
  7. 2022_天勤数据结构高分笔记_第二章_算法
  8. proteus部分元件中英对照
  9. docker生态-mysql客户端phpAdmin
  10. 正确方法将电子书放到Kindle的documents文件夹,还是看不了书?
  11. Cholesky分解(Matlab代码实现)
  12. 浅谈:智能化变电站在线监测系统
  13. 射频测试 —— 蓝牙定频测试1
  14. vw 前端_【前端适配】vw+rem自适应适配方案
  15. 皮尔森相关性系数的计算python代码(四)(热力图版)
  16. 蓝牙配对码配置错误_“看yellow 的时候,连错了蓝牙耳机,结果....”哈哈哈哈我笑到村里通网!!...
  17. VS2019+QGIS开发库二次开发环境搭建
  18. nginx和tomcat本地部署
  19. Mysql主键与事务
  20. Android开发 之 LinearGradient与闪动文字效果

热门文章

  1. win7访问局域网计算机提示凭据,win7系统访问局域网共享文件时提示输入网络凭据的解决方法?...
  2. 第一天 渗透的基本概念
  3. matlab 获取文件毫秒时间,Matlab:将文件日期以毫秒转换为Matlab时间格式
  4. python基础--del操作
  5. 正则正数,负数,整数,浮点数校验大全
  6. 三轴加速度传感器LIS3DH使用心得
  7. 用qq来搞定gmail,yahoo,hotmail,126 邮箱 POP3协议
  8. 虚拟摄像头之DirectShow虚拟摄像头开发
  9. 通过fileProvider接收外部App传递文件路径的一些坑
  10. Web端实现视频通话