(C语言)求最大公约数的四个方法
目录
一、穷 举 法
二、辗 转 相 除 法
三、更 相 减 损 术
四、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的最大公约数的函数
- 当a和b均为偶数,gcb(a,b) = 2gcb(a/2, b/2) = 2 * gcb(a>>1, b>>1)
- 当a为偶数,b为奇数,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b)
- 当a为奇数,b为偶数,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1)
- 当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语言)求最大公约数的四个方法相关推荐
- 用C语言求最大公约数的4种方法
C语言求最大公约数的四种方法如下: 辗转相除法:通过不断地交换两个数,使较大的数除以较小的数,最后得到的余数即为最大公约数. 更相减损术:通过不断地让两个数减去较小的数,最后得到的结果即为最大公约数. ...
- C语言|求最大公约数和最小公倍数多种方法
在开始之前我们先了解下什么是最大公约数和最小公倍数: 例如有两个数:a 和b 最大公约数用gcd表示,最小公倍数用lcm表示. 1.最大公约数就意味着能同时被a和b整除,即a%gcd==0 & ...
- C语言求最大公约数最小公倍数的简单方法
文章目录 前言 一.大致思路 1.暴力求解 2.辗转相除法 二.总结 1.注意事项 2.结束语 前言 在做C语言相关练习的时候,会遇见比较经典的一道题型,就是求最大公约数或者最小公倍数.今天简单介绍几 ...
- C语言求最大公约数的三种方法
最大公约数是两个数可以同时整除的数中最大的那个 这里用三种方法来解决 穷举法求最大公约数 判断x和y的最大公约数,x和y其中一定有一个相对较小的数,然后从这个较小数开始遍历,不断地用x和y去除这个数, ...
- C语言求最大公约数3种方法
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105163610 C ...
- c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法
C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...
- C语言求最大公约数GCD的算法(附完整源码)
C语言求最大公约数GCD的算法 C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) #include < ...
- c语言怎样求最大公约数,c语言求最大公约数
求差判定法. 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60 ...
- C语言求最大公约数及最小公倍数
C语言求最大公约数及最小公倍数 1. 最大公约数 1.1 定义 最大公约数(Greatest Common Divisor,GCD),也称最大公因数.最大公因子,是一种数学概念,指两个或多个整数共 ...
最新文章
- js---25桥模式
- C++ Primer 5th笔记(chap 11)关联容器---无序容器
- 爱奇艺在 Dubbo 生态下的微服务架构实践
- java自定义配置文件_自定义配置文件如何配置
- qsort函数应用大全
- python计算器基础知识_Python基础(一):将Python当做计算器、编程的第一步
- UVA 10895——Matrix Transpose
- 如何提高VFP应用软件的路径适应性
- benchmark问题_使用U盘来掩盖CEPH IO性能低下的问题
- ORA-00257归档日志写满的解决方法 - xwdreamer - 博客园
- poj 3243 Clever Y(Baby-Step Giant-Step)
- mysql管理工具_15款最佳的MySQL管理工具和应用程序
- Word 2010:22个经典小技巧大放送
- php工程师外派,招聘兼职Php工程师|Php工程师外包-猿急送
- mysql 5.7 存储引擎_简述MySQL 7种存储引擎
- Linux相关命令(三)
- yar php使用,php中yar框架实例用法讲解
- TCP/IP协议分层
- 使用python3爬去360图片
- codeforces contest 1166 E. The LCMs Must be Large---思维