zoukankan      html  css  js  c++  java
  • 算法求最大公约数的三种方法和优缺点

    辗转相除法

    俩个正整数的最大公约数等于他们的余数和较小数之间的最大公约数

    package gcl;
    
    public class Gcl_1 {
        /**
         * 求最大公约数 转转相除法
         *
         * 缺点 取余操作效率低
         */
        public static int gcl(int a,int b){
            int max = a>b?a:b;
            int min = a<=b?a:b;
            if(max%min==0){
                return min;
            }
            return gcl(max,max%min);
        }
    
        public static void main(String[] args) {
    //        System.out.println(gcl(10,5));
            System.out.println(gcl(10000000,5));
        }
    }
    
    结果
    5
    

    更相减损法

    俩个正整数的最大公约数等于他们的差值和较小数之间的最大公约数

    package gcl;
    
    public class Gcl_2 {
        /**
         * 更相减损法
         *
         * 缺点 ,如果俩数差距太大运算次数过多
         */
        public static int gcl2(int a,int b){
            int max =a>b?a:b;
            int min = a<=b?a:b;
            if(max==min){
                return min;
            }
            return gcl2(max-min,min);
        }
    
        public static void main(String[] args) {
            System.out.println(gcl2(10,5));
        }
    }
    结果 
    5
    

    位移法

    当俩个数字中任意一个数字是偶数时要通时进行右移,也就是除2操作,如果同时右移,这就要保留乘2,因为这是俩个数字的公约数。

    package gcl;
    
    public class Gcl_3 {
        /**
         * 通过位运算进行除2操作,当俩个数字都不偶数时进行更相减损法
         *
         * 判断一个数是否是偶数, 3 &1  0010 &0001 =0 即和1 做与操作等于0及是偶数
         */
        public static int gcl3(int a, int b){
            int max = a>b?a:b;
            int min = a<=b?a:b;
            if(a==b){
                return b;
            }else if((a&1)==0 && (b&1)==0){
                return gcl3(a>>1,b>>1)*2;
            }else if((a&1)!=0 && (b&1)==0){
                return gcl3(a,b>>1);
            }else if((a&1)==0 && (b&1)!=0){
                return gcl3(a>>1,b);
            }else{
                return gcl3(a,a-b);
            }
    
        }
    
        public static void main(String[] args) {
            System.out.println(gcl3(5,10));
        }
    }
    
    

    三种方法对比,辗转取模太慢,更相俩个数差距过大需要运算次数太多,而位运算则结合了俩种的优点,

    不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!
  • 相关阅读:
    李宏毅2021春机器学习课程笔记——通过训练集上的Loss可获得的信息
    python学习-NotImplementedError的使用
    代码运行优化
    django实现上传文件读取文件内容
    django-admin上传下载文件
    AtCoder Beginner Contest 191 F
    敏感词过滤 AC自动机
    面经知识点
    select poll epoll实例
    socket用法
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/15591001.html
Copyright © 2011-2022 走看看