一、欧几里得算法
欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。
二、算法简介
1.数学原理
假设两个正整数a,b;我们求它们的最大公约数;
a = b*k+r
当r不等于0时,a=b,b=r,一直递归下去
因为 r = a - kb,他们有同一个最大公约数d,即 r / d = (a-kb)/ d = a/d - kb / d;可以一直类推,直到 r == 0时,b就为最大公约数。
下面我们举一个数学例子!
如下(示例):
假如我们要求两个正整数的最大公约数,假设我们要求615和333的最大公约数,用欧几里得算法是这样算的:
615=333*1+282
333=282*1+51
282=51*5+27
51=27*1+24
27=24*1+3
24=3*8+0
所有最大公约数为3!!!
2.代码实现
代码如下(示例):
(1).初级版本
#include<iostream>
using namespace std;
int gcd(int x, int y)
{
int a;
a = x % y;
if (a == 0)
{
return y;
}
x = y;
y = a;
return gcd(x, y);
}
int main()
{
int x, y;
cin >> x >> y;
int k = gcd(x, y);
cout << k;
return 0;
}`
注意:该代码只为让初学者理解其原理,因此只适用于部分数据!!!
(2).升级版本
#include<iostream>
using namespace std;
int gcd(int x, int y)
{
if (x % y == 0) return y;
else return gcd(y, x % y);
}
int main()
{
int x, y;
cin >> x >> y;
int k = gcd(x, y);
cout << k;
return 0;
}
(3).运行结果
总结
gcd算法是科班必需要知道和会使用的算法之一!通过gcd我们可以快速求得两个数的最大公约数,大大减少我们的计算时间。