zoukankan      html  css  js  c++  java
  • 求两个整数的最大公约数GCM

    思路分析:

    (1)求差判定法:
       如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6.
       如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和小数的最大公约数就是原来两数的最大公约数.
       例如:求92和16的最大公约数.92-16=76,76-16=60,60-16=44,44-16=28,28-16=12,12和16的最大公约数是4,
      所以92和16的最大公约数就是4.
    (2)辗转相除法:
      当两个数都较大时,采用辗转相除法比较方便.其方法是:
        以小数除大数,如果能整除,那么小数就是所求的最大公约数.否则就用余数来除刚才的除数;再用这新除法的余数去除刚才的余数.
        依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数.
      例如:求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.
        核心思路就是:算法的核心思想就是大数除小数,如果得出来的数有余数,把这个余数做为下一次的除数,上一次的除数做为被除数,直到最后相除的余数为0,则除数即为最大公约数。

    /**
         * 采用递归法实现求两个数的最大公约数
         */
        public static int GCM(int a, int b) {
            int max, min;
            max = a > b ? a : b;
            min = a < b ? a : b;
            
            if (max % min == 0)
                return min;
            else
                return GCM(min, max % min);
        }
    
    /**
         * 采用非递归方法实现求两个数的最大公约数
         */
        public static int GCM1(int a, int b) {
            int max, min;
            int temp;
            max = a > b ? a : b;
            min = a < b ? a : b;
            
            if (max % min == 0)
                return min;
            while (max % min != 0) {
                temp = max % min;
                max = min;
                min =temp;
            }
            return min;
        }    

    -------------------------------------------------------------------------------------------------
      求两个数的最小公倍数 LCM (lowest common multiple)
    思路:求两个整数的最小公倍数就是求:这两个数的乘积除以这两个整数的最大公约数,你说是不是这个理?
    (最小公倍数=两数的乘积/最大公约数)
    *
    */

  • 相关阅读:
    HDU 2899 Strange fuction
    HDU 2899 Strange fuction
    HDU 2199 Can you solve this equation?
    HDU 2199 Can you solve this equation?
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
  • 原文地址:https://www.cnblogs.com/myseries/p/5230300.html
Copyright © 2011-2022 走看看