分享

欧几里德算法

 长沙7喜 2018-12-12


【问题描述】输入任意两个自然数,求它们的最大公约数。

【样例输入】

8 40

【样例输出】

8


问题解析:

今天我们讲一个数学技巧,欧几里德算法。

(1)欧几里德算法也叫辗转相除法,是指用于计算两个正整数a,b的最大公约数。

(2)算法原理:

对于任意两个正整数a和b,如果a/b = q...r(a除以b的商是q,余数是r),那么a和b的最大公约数等于b和r的最大公约数。

具体的算法过程如下:

(1)a/b = q1...r1。

(2)如果r1=0,则a和b的最大公约数为b。

如果r1≠0,则继续除法运算:b/r1=q2...r2。

(3)如果r2=0,则a和b的最大公约数为r1。

 如果r2≠0,则继续除法运算:r1/r2=q3...r3。

(4)重复执行上述过程,直到能够整除为止。余数为0时的除数就是a和b的最大公约数。

 

所以根据欧几里德算法,求解a和b的最大公约数也就是重复执行除法运算并判断余数是否为0的过程。




首先我们使用while循环来模拟上述过程:

【参考程序】

#include

using namespace std;

int main(){

    int a1,b1,a,b,r;

    cin >> a1 >> b1;

    a = max(a1,b1);

    b = min(a1,b1);

    r = a%b;

    while(r!=0) {

        a = b;

        b = r;

        r = a%b;

    }

    cout < b=""><>

    return 0;

}

 


上面的算法过程其实也是一个递归的过程,递归关系式为:gcd(a,b)=gcd(b,r)。


接下来我们使用递归算法来模拟上述过程:

【参考程序】

#include

using namespace std;

int gcd(int a,int b){

    int r = a % b;

    if(r == 0){

        return b;

    }else{

        return gcd(b,r);

    }

}

int main(){

    int a1,b1,a,b;

    cin >> a1 >> b1;

    a = max(a1,b1);

    b = min(a1,b1);

    cout < gcd(a,b)=""><>

    return 0;

}

 


 

 

 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多