数论之GCD

   今天学习了一下辗转相除法,又名欧几里得算法,这是一个求最大公约数的一种方法,在此,在这里分享一下学习成果。

   何为辗转相除法? 具体做法是,用较大的数(被除数) ÷  较小的数(除数) ,再用他俩的余数 去做除数,较小的数做被除数,如此反复,直到余数为0为止,那么最后的除数就是这两个数的最大公约数。这里的操作我们就想到了递归。

    

   证明方法如下:

  若求a,b的最大公约数,a可以表示成 a = kb+r(a,b,k,r 都为整数,且  r < b),r = a mod b

       假设x 是a,b 的一个公约数,即a,b都可被 d 整除

       根据 a = kb+r 可知  r = a-kb, 给等式左右分别除 d, 则 r/d 也为一个整数,因此得出 d 既是 a,b的约数,也是 r 的约数。

        因此,(a,b) 和 (b, a mod b )的公约数是一样的 ,其最大公约数也必然相等。

 

现在呢,用代码实现以下:

c++ 版本:

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int gcd(int a, int b){
    if(a < b)
    swap(a,b);
   return b == 0 ? a : gcd(b,a%b); 
    
}
int main()
{
    int a,b,c;
    scanf("%d %d",&a,&b);
    printf("%d",gcd(a,b));
    
}

 

JavaScript 版本:

function gcd(a, b) {
        if (a % b == 0) return b;
        return gcd(b, a % b);
    }

 


  

posted @ 2020-03-13 15:54  快乐柠檬  阅读(261)  评论(0编辑  收藏  举报