erlang 最大公约数

 辗转相除法定义

1)辗转相除法:以大数除以小数,如果能整除,那么小数就是所求的最大公约数(Greatest CommonDivisor:gcd)。否则就用余数来除刚才的除数; 再用这新除法的余数去除刚才的余数。依此类推,直到一个除法能够整除,这时作为除数的数就是        所求的最大公约数。即:gcd(x,y)表示x与y的 最大公约数,有gcd(x,y)=gcd(y,x%y),如此便可把原问题转化为求两个更小数的公约数,直到其中一个数为0,剩下的另外一个数就是两者的最大公约数。

      例如:求 4453 和 5767 的最大公约数时,可作如下除法. 

      5767÷4453=1 余 1314 

      4453÷1314=3 余 511 

      1314÷511 =2 余 292 

      511 ÷292 =1 余 219 

      292 ÷219 =1 余 73 

      219÷73=3

    于是得知,5767 和 4453 的最大公约数是 73。辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数。

C语言中,通过递归可简单实现,具体如下:

  int Euclidean_Recursion(int m, int n) {
      if (n == 0)
          return m;
      return method1(n, m % n);
  }

erlang的实现,具体如下:

-module(common_divisor).

-export([test/2]).

%两个数的最大公约数
test(M,N) ->
        if N == 0 -> M;
            true -> test(N, M rem N)
        end. 

打印结果:

结果为73 

猜你喜欢

转载自www.cnblogs.com/unqiang/p/9476064.html
今日推荐