目录

一、穷 举 法

二、辗 转 相 除 法

三、更 相 减 损 术

四、Stein算法(结合辗转相除法和更相减损法的优势以及移位运算)


一、穷 举 法

即是最暴力无脑的方法:直接暴力枚举,直到出现一个能同时整除两数的值。但是不推荐,即浪费CPU.又浪费时间。

//穷举法
int divi_0(int x, int y)
{if (x < y){int tmp = y;y = x;x = tmp;}for (int i = y; i >= 1; i-- ){if (x%i == 0 && y%i == 0){return i;}}
}

二、辗 转 相 除 法

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

定理:divi(a, b) = divi(a, a%b)

证明:对于 divi(a, b)

`         假设 d 是 a、b 的公约数,r = a%b, a = kb + r, r = a - kb, 即d 也是 r 的公约数;

对于divi(a, a%b)

假设另一 d 是 a, a%b 的公约数,r = a%b, a = kb + r, b = (a - r)k 即d也是 b 的公约数;

由此可证得最大公约数也是相同的。

//辗转相除法
int divi_1(int a, int b)
{int divi = 0;while (a%b){divi = a % b;a = b;b = divi;}divi = b;return divi;
}

三、更 相 减 损 术

更相减损法:更相减损术, 出自于中国古代的《九章算术》,也是一种求最大公约数的算法。
  ①先判断两个数的大小,如果两数相等,则这个数本身就 是就是它的最大公约数。
  ②如果不相等,则用大数减去小数,然后用这个较小数与它们相减的结果相比较,如果相等,则这个差就是它们的最大公约数,而如果不相等,则继续执行②操作。

原理:divi(a, b) = divi(b, a - b);

证明:假设 d 是a、b的公约数,r = a - b, 则d 是 r 的公约数,同理可证 最后两个数相等时一定是原来两个数的最大公约数。

//更相减损术
int divi_2(int a, int b)
{if (a == b){return a;}else if (a > b){return divi_2(a - b, b);}else{return divi_2(b - a, a);}
}

四、Stein算法(结合辗转相除法和更相减损法的优势以及移位运算)

众所周知,移位运算的性能非常快。对于给定的正整数a和b,不难得到如下的结论。其中gcb(a,b)的意思是求a,b的最大公约数的函数

  1. 当a和b均为偶数,gcb(a,b) = 2gcb(a/2, b/2) = 2 * gcb(a>>1, b>>1)
  2. 当a为偶数,b为奇数,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b)
  3. 当a为奇数,b为偶数,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1)
  4. 当a和b均为奇数,利用更相减损术运算一次,gcb(a,b) = gcb(b, a-b), 此时a-b的结果必然是偶数,又可以继续进行移位运算。

证明:通过辗转相除法和更相减损术的证明易证。

//两者结合后的Stein算法
int Stein(int x, int y)
{if (x < y){int tmp = x;x = y;y = tmp;}if ( x%y == 0){return y;}if (x % 2 == 0 && y % 2 == 0){return 2*Stein(x >> 1, y >> 1);}else if (x%2 == 0 && y%2 != 0){return Stein(x >> 1, y);}else if (x % 2 != 0 && y % 2 == 0){return Stein(x, y >> 1);}else if (x % 2 != 0 && y % 2 != 0){return Stein(x, (x - y) >> 1);}
}

(C语言)求最大公约数的四个方法相关推荐

  1. 用C语言求最大公约数的4种方法

    C语言求最大公约数的四种方法如下: 辗转相除法:通过不断地交换两个数,使较大的数除以较小的数,最后得到的余数即为最大公约数. 更相减损术:通过不断地让两个数减去较小的数,最后得到的结果即为最大公约数. ...

  2. C语言|求最大公约数和最小公倍数多种方法

    在开始之前我们先了解下什么是最大公约数和最小公倍数: 例如有两个数:a 和b 最大公约数用gcd表示,最小公倍数用lcm表示. 1.最大公约数就意味着能同时被a和b整除,即a%gcd==0 & ...

  3. C语言求最大公约数最小公倍数的简单方法

    文章目录 前言 一.大致思路 1.暴力求解 2.辗转相除法 二.总结 1.注意事项 2.结束语 前言 在做C语言相关练习的时候,会遇见比较经典的一道题型,就是求最大公约数或者最小公倍数.今天简单介绍几 ...

  4. C语言求最大公约数的三种方法

    最大公约数是两个数可以同时整除的数中最大的那个 这里用三种方法来解决 穷举法求最大公约数 判断x和y的最大公约数,x和y其中一定有一个相对较小的数,然后从这个较小数开始遍历,不断地用x和y去除这个数, ...

  5. C语言求最大公约数3种方法

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105163610 C ...

  6. c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法

    C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...

  7. C语言求最大公约数GCD的算法(附完整源码)

    C语言求最大公约数GCD的算法 C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) #include < ...

  8. c语言怎样求最大公约数,c语言求最大公约数

    求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...

  9. C语言求最大公约数及最小公倍数

    C语言求最大公约数及最小公倍数 1. 最大公约数 1.1 定义 ​ 最大公约数(Greatest Common Divisor,GCD),也称最大公因数.最大公因子,是一种数学概念,指两个或多个整数共 ...

最新文章

  1. js---25桥模式
  2. C++ Primer 5th笔记(chap 11)关联容器---无序容器
  3. 爱奇艺在 Dubbo 生态下的微服务架构实践
  4. java自定义配置文件_自定义配置文件如何配置
  5. qsort函数应用大全
  6. python计算器基础知识_Python基础(一):将Python当做计算器、编程的第一步
  7. UVA 10895——Matrix Transpose
  8. 如何提高VFP应用软件的路径适应性
  9. benchmark问题_使用U盘来掩盖CEPH IO性能低下的问题
  10. ORA-00257归档日志写满的解决方法 - xwdreamer - 博客园
  11. poj 3243 Clever Y(Baby-Step Giant-Step)
  12. mysql管理工具_15款最佳的MySQL管理工具和应用程序
  13. Word 2010:22个经典小技巧大放送
  14. php工程师外派,招聘兼职Php工程师|Php工程师外包-猿急送
  15. mysql 5.7 存储引擎_简述MySQL 7种存储引擎
  16. Linux相关命令(三)
  17. yar php使用,php中yar框架实例用法讲解
  18. TCP/IP协议分层
  19. 使用python3爬去360图片
  20. codeforces contest 1166 E. The LCMs Must be Large---思维

热门文章

  1. 《算法图解》学习笔记(六):图和广度优先搜索(附代码)
  2. 淘宝天猫抓包评论地址
  3. 【总结】包和模块(2022.4.27)
  4. SFI立昌SEA方案与应用
  5. Java 字符串分割三种方法
  6. c语言 feof 死循环,请教:为什么我用while(!feof(fp))时会出现无限循环????
  7. 高级Lyapunov稳定性
  8. php安装过程,php怎么安装教程
  9. 中国风PPT不会做?三个小技巧帮你搞定!!!
  10. 【Bitmap-旋转】解决Android相机拍照之后照片的翻转问题