欧几里德与扩展欧几里德 小讲 【 理解 + 例题 】 更新 ing

来源:互联网 发布:php模拟get请求 编辑:程序博客网 时间:2024/06/04 19:31

    欧几里德算法又称辗转相除法,用于计算两个正整数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;}






   

0 0
原创粉丝点击