欧几里德求最大公约数(辗转相除法)

Def:

  用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数为0。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

  eg:1997和615的最大公约数?

    1997 / 615 = 3······152

     615  / 152 = 4······7

     152  /   7   = 21·····5

         7  /   5   = 1······2

      2  /   1   =  2······0 //最大公约数为1

代码:

  #include <iostream>
  using namespace std;
  
  int main()
  {
      int a, b, m, n, r;
      cout << "输入两个不相等的整数:"  ;
      cin >> a >> b;
      //保证m作为较大数,n为较小数
         if(a > b)  
     {
         m = a;
         n = b; 
     }
     else
     {
         m = b;
         n = a;
     }
     //辗转相除法 
     do
     {
         r = m % n;  //r为余数
         m = n;        //更新被除数上一除数
         n = r;         //更新除数为上一余数
     }while(r != 0);
     cout << "输入的两个数的最大公约数是:" << m <<endl;
 }

 

  • 关于三个数的最大公约数

  GCD (a, b, c) = GCD (a, GCD (b, c)) = GCD (GCD (a, b), c) = GCD (GCD (a, c), b)

  即。先求两个数的GCD再求和另一个数的GCD。(n个数的最大公约数同理)

posted @ 2021-07-31 09:31  白藏i  阅读(54)  评论(0)    收藏  举报