欧几里得算法模板

来源:互联网 发布:淘宝新上的宝贝找不到 编辑:程序博客网 时间:2024/06/06 04:47

一、公式

gcd(a,b) = gcd(b,a mod b)

二、证明

第一步:令c为a和b的最大公约数,数学符号表示为c=gcd(a,b).因为任何两个实数的最大公约数c一定是存在的,也就是说必然存在两个数k1,k2使得a=k1.c, b=k2.c
第二步:a mod (b)等价于存在整数r,k3使得余数r=a – k3.b.
             即r = a – k3.b
            = k1.c – k3.k2.c
            = (k1 – k3.k2).c
        显然,a和b的余数r是最大公因数c的倍数!

三、代码:

(一)递归

int gcd(int a,int b){return b==0?a:gcd(b,a%b);}

(二)循环

int gcd(int big, int small){    if (small > big) swap(big, small);    int temp;    while (small != 0){ //  辗转相除法        if (small > big) swap(big, small);        temp = big % small;        big = small;        small = temp;    }    return(big);}