欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。(扩展欧几里德将在后续更新、、、)
定理:gcd(a, b) = gcd(b, a mod b) (a > b 且a mod b 不为0) (证明过程可以参见百度百科)
某些巨巨总是会说,数论只会gcd, 这类人,也只能仰望吧、、、
关于gcd 的应用,应该就是需要用到最大公约数的地方吧 - - #,我也不大清楚,只记得以前写过一道什么直线什么的,等等贴出来看看、、
gcd 可以通过迭代,或者是递归的方式来实现,下面我们来看一段实现代码:
// 递归实现, b = 0 时退出
int gcd(int a, int b)
{
if(b == 0)
return a;
return gcd(b, a % b);
}
// 迭代实现、、、
int gcd(int a, int b)
{
while(b != 0)
{
int r = b;
b = a % b;
a = r;
}
return a;
}
例题:
1. hdu 2503 a/b + c/d 链接 http://acm.hdu.edu.cn/showproblem.php?pid=2503
题意就是:给你2个分数,求他们的和,并要求和为最简形式。
#include <stdio.h>
#include <algorithm>
using namespace std;
int gcd(int a, int b)
{
int t; // 之前傻傻地用min,max 真是逗了、
if(a < b)
{
t = a;
a = b;
b = t;
}
if(a % b == 0)
return b;
else
return gcd(b, a % b);
}
int main()
{
int n, a, b, d, k1, k2, k3, k4;
scanf("%d", &n);
while(n --)
{
scanf("%d %d %d %d",&k1, &k2, &k3, &k4);
a = k1 * k4 + k2 * k3;
b = k2 * k4;
d = gcd(a, b);
printf("%d %d\n", a/d, b/d);
}
return 0;
}