zoukankan      html  css  js  c++  java
  • 数论之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);
        }


      

  • 相关阅读:
    JMS API学习总结(一)
    java读取properties配置文件
    如何创建并运行java线程
    JS
    JS
    JS
    JS
    IE
    JS
    JS
  • 原文地址:https://www.cnblogs.com/wtzmz/p/12487008.html
Copyright © 2011-2022 走看看