算法怎么就这么难?----使用欧几里得算法求两数的最大公约数
本人菜鸟一枚,上午在看书的时候突然看到了求最大公约数的一个例题,突然就想到以前好像看过一个欧几里得算法,故又上网仔细找了一下欧几里得算法的原理。可能是本人时间长没看算法,脑子都生锈了。
看了几个讲解欧几里得算法的文章,大都只给公式,然后说了一大堆因为、、、、在我还没看懂的时候,突然来了个所以、、、然后公式就这样推出来的。⊙﹏⊙b汗!
经过我这令人捉急的小脑袋转了半天,最后有了点眉目,所以拿出来和大家分享一下!
1.首先说一下:欧几里得算法是求两个数的最大公约数的,你可能会问:什么是最大公约数?
(⊙﹏⊙我在一开始看到这个问题的时候,我就突然脑子短路,竟然不知道最大公约数是什么了)
最大公约数:即能够同时被两个数整除的那个最大的数。例如:8是16和8的公约数,因为16%8和8%8都等于零嘛!但4也是啊!所以两个数的公约数会有很多,但我们要找出那个最大的!
2.让我们来使用算式分析一下,假设求x和y的最大公约数。
a).先假设x>y,x和y的最大公约数用f(x,y)表示
b).假设 x/y = a;
x%y = b;
所以:a*y + b = x
(这个应该能看出来,因为a为x除以y的整数部分,b为x除以y的余数部分,所以a*y + b = x)
将上面那个式子调换一下位置得到:b = x – a*y;
因为x和y都能够被f(x,y)整除 -----因为f(x,y)是x和y的最大公约数嘛
所以 b 也能够被f(x,y)整除 -----即x和y的最大公约数f(x,y),它也是b的约数,所以求x和y的最大公约数也就相当于求y和b的最大公约数。(你可能会问,为什么本来求x和y的最大公约数,最后转了半天变成了求y的b的公约数了?因为 y < x嘛,而且x%y肯定也小于y,所以,这样一来,我们就把求最大公约数的范围缩小了啊)
所以、欧几里得的公式也就是这么来的f(x,y) = f(y,x%y);
所以这个算法的实现也就是不停的迭代,直到找出了x%y等于0时,则停止迭代,那个时候最大公约数也就是y了(因为x%y都等于0了,所以x和y的最大公约数也就是y本身了)。
3.上面可能说得有点啰嗦了,大家莫怪,本人也是想讲得更清楚嘛!下面直接附上代码实现部分:
public static int gcd(int x, int y){
//防止输入为0,导致程序出错
if(x == 0 || y == 0){return 0;}
//添加一个判断保证x > y
if(x < y){
int temp = x;
temp = y;
y = x;
}
//算法实现
if(x%y == 0){
return y;
}else
{
return gcd(y,x%y);
}
}
其实还有好多其它的优秀的算法,在这里就先不提了,毕竟欧几里得算法就挺高效的。在有些公司,这道题还作为笔试题出现过呢,所以,即将毕业去找工作的未来程序员,还是应该好好看一下的!O(∩_∩)O哈哈~
转载于:https://www.cnblogs.com/inghzhang/p/3884700.html
算法怎么就这么难?----使用欧几里得算法求两数的最大公约数相关推荐
- 用递归法求两个数的最大公约数
用递归法求两个数的最大公约数 求两个数的最大公约数的思路是,用辗转现除法 辗转相除法求两个数的最大公约数的步骤如下: 先用小的一个数除大的一个数,得第一个余数: 再用第一个余数除小的一个数,得第二个余 ...
- 编写函数求两个数的最大公约数,采用递归法计算两数的最大公约数。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: [实验案例3:函数的递归调用] 编写函数求两个数的最大公约数,采用递归法计算两数的最大公约数. [实验指导] 分析:m.n为两 ...
- 欧几里得算法求两个正整数的最大公约数
此题可以使用暴力破解法解决,但是效率不高. 欧几里德算法又称辗转相除法,其计算原理依赖于下面的定理: gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0) ...
- C语言实现辗转相除法和更相减损法求两数最大公约数,及求最小公倍数的方法
在学习从C语言过程中,我们会遇到一个题目,求两个整数的最大公约数,那么接下来分别介绍两种方法求最大公约数 1,辗转相除法 辗转相除法, 又名欧几里德算法(Euclidean Algorithm),是求 ...
- 求两数的最大公约数算法
最大公约数,也称最大公因数.最大公因子,指两个或多个整数共有约数中最大的一个: a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号: ...
- C语言,枚举法求两个数的最大公约数
#include <stdio.h> /** 求a,b的最大公约数*/ int main() {//枚举法printf("Please enter two integer:\n& ...
- Python 使用穷举法求两个数的最大公约数。
for m in range (0,2):a = int(input("请输入一个数:"))b = int(input("请输入另外一个数:"))#判断num1 ...
- 欧几里得算法求最大公约数python,算法:欧几里得求最大公约数(python版)
#欧几里得求最大公约数 #!/usr/bin/env python #coding -*- utf:8 -*- #iteration def gcd(a,b): if b==0: return a e ...
- 离散数学/初等数论:用“质因子分解法”和“欧几里得算法”求最大公约数gcd;“质因子分解法”和“最简算法”求最小公倍数lcm;以及对“意义”的一些看法。
需要在开头提前说明,本篇文章仅仅用于在学习初等数论或者离散数学时候对算术基本定理的理解,实际应用的时候把结论告诉大家,想求最大公约数就用欧几里得算法是最简单的,在本篇不再赘述,有机会我会在其他文章中说 ...
- 用欧几里得算法求最大公约数_欧几里得算法:GCD(最大公约数),用C ++和Java示例解释...
用欧几里得算法求最大公约数 For this topic you must know about Greatest Common Divisor (GCD) and the MOD operation ...
最新文章
- Fiddler可以支持Websocket抓包了
- python的xpath用法_python之Xpath语法
- PHP 页面静态化/纯静态化/伪静态化
- ITK:图像区域重叠
- Android对话框dialog大全
- 32年寻获上帝粒子,华人女学者自述高能人生故事
- Android图片的Base64编码与解码
- Unreal Engine 4 字符串转换
- WPF and Silverlight 学习笔记(十九):WPF更换主题
- 人工智能+教育的应用——教育的安全
- 前端代码规范【结合实际和官方】
- 三种最常见的框架解析 | 如何创建JUnit参数化测试
- 【时间纷飞】死人,死人
- 图片转换js (img对象,file对象,base64,canvas对象),以及图片压缩方式
- 北京的互联网公司有哪些?
- 为什么不想做产品经理
- 更换固态,重装win10系统
- Android 8.0+调用相机相册
- Kibana基础:3:生成定制化的Dashboard
- sws_scale函数像素数据格式的转换yuv转rgba