zoukankan      html  css  js  c++  java
  • 求最大公约数的几种算法

      给定两个整数,求出这两个整数的最大公约数是我们从小就接触过的问题,但是我们如何用更简洁的算法来计算呢?

      本文中,假定这两个整数是m和n且m>=n>=0。让我们从最简单的算法说起!

      

    一、Consecutive Integer Test——连续整数检测算法

      由最大公约数的概念,我们可以知道,能够同时被两个给定整数整除的最大整数,即是最大公约数。那么我们可以最简单的想出用暴力搜索的方法,从两个整数中较小的那一个开始,向下穷举遍历,找到最大公约数。当然,这种方法是低效的,存在着很大的不确定性。

      Step1:将min{m,n}的值赋给t。

      Step2:判断t是否为0,如果是0,返回max{m,n};否则,进入第三步。

      Step3:m除以t,如果余数为0,则进入第四步;否则进入第五步。

      Step4:n除以t,如果余数为0,则返回t值作为结果;否则进入第五步。

      Step5:把t的值减1,返回第三步。

     1 int consecutiveIntegerTest(int m, int n) {
     2     int t = n;
     3     while (t != 0) {
     4         if (m % t == 0) {
     5             if (n % t == 0)
     6                 return t;
     7             else
     8                 --t;
     9         } else
    10             --t;
    11     }
    12     return m;
    13 }

      最终的返回值m,即为m和n的最大公约数。

    二、Euclidean(recursion)——欧几里得算法

      求取最大公约数最经典的算法莫过于欧几里得算法了,既是所谓的辗转相除法,比起暴利搜索更加高效稳定。

      欧几里得算法有递归和非递归两种表达方式。

      (递归方式)

      

    1 int Euclidean_Recursion(int m, int n) {
    2     if (n == 0)
    3         return m;
    4     return method1(n, m % n);
    5 }

      (非递归方式)

    1 int Euclidean_nonRecursion(int m, int n) {
    2     while (n != 0) {
    3         int r = m % n;
    4         m = n;
    5         n = r;
    6     }
    7     return m;
    8 }

      以上就是求出m,n最大公约数的三种算法,希望大家互相学习。

      人生有理想,拼搏需坚持。

      阶段小目标,跬步成千里!

      

  • 相关阅读:
    LeetCode--Reorder List
    LeetCode--Combination Sum
    LeetCode--Binary Tree Level Order Traversal
    LeetCode--Plus One
    第五届蓝桥杯决赛CC++B组——生物芯片
    第五届蓝桥杯决赛CC++B组——Log大侠
    第五届蓝桥杯决赛CC++B组——出栈次序
    1098 均分纸牌 ——http://codevs.cn/problem/1098/
    1294 全排列——http://codevs.cn/problem/1294/
    1501 二叉树最大宽度和高度——http://codevs.cn/problem/1501/
  • 原文地址:https://www.cnblogs.com/andrewliang/p/5890188.html
Copyright © 2011-2022 走看看