• 算法求最大公约数的三种方法和优缺点


    辗转相除法

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

    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));
        }
    }
    
    

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

    不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!
  • 相关阅读:
    Codeforces Round #710 (Div. 3)
    Codeforces Round #708(Unrated on Div. 2)
    [JSOI2014]学生选课(二分+2-SAT)
    Educational Codeforces Round 103 (Rated for Div. 2)爆炸记
    AtCoder Beginner Contest 190
    GPU服务器centos7.4下安装jupyter后调用py文件以及调用失败的解决办法
    关于在centos7.4原来python2.7.5更新到python3.6或更高版本时注意事项
    Selenium初步应用
    CentOS利用docker安装MySQL5.7
    CentOS 常用命令
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/15591001.html
Copyright © 2020-2023  润新知