• 求两个数的最大公约数



    求两个数的最大公约数

     


    问题:给定两个正整数a和b,求他们的最大公约数。

    • 最简单的方法就是穷举法,如果a>b,那么依次计算1~b的所有整数是否是a和b的公约数。
        public static void main(String[] args) {
            long timer = System.currentTimeMillis();
            System.out.println(getGCB(1000234234,1242342390));
            System.out.println(System.currentTimeMillis() - timer);
        }
        private static int getGCB(int a, int b){
            int result = 0;
            for(int i = 2; i < b; i++){
                if(a % i == 0 && b % i == 0){
                    result = i;
                }
            }
            return result;
        }
    运行时间为:6767ms(随着a、b的值越大该时间越长),在节省一点时间效率就是sqrt(b)
    • 辗转相除法,如果a>b,a和b的最大公约数为b和a%b的最大公约数。
        public static void main(String[] args) {
            long timer = System.currentTimeMillis();
            System.out.println(getGCB(1999999250,42342355));
            System.out.println(System.currentTimeMillis() - timer);
        }
        private static long getGCB(long a, long b){
            if(b == 0)
                return a;
            return getGCB(b, a% b);
        }
    时间效率是0
    • a和b(a>b)最大公约数等于a-b的差值c和较小数b的最大公约数
    public static void main(String[] args) {
            long timer = System.currentTimeMillis();
            System.out.println(getGCB(1999999250,33442355));
            System.out.println(System.currentTimeMillis() - timer);
        }
        private static int getGCB(int a, int b){
            if(a == b)
                return a;
            else if(a > b)
                return getGCB(a - b, b);
            else{
                return getGCB(b - a, a);
            }
        }
    本方法可能出现异常,此为程序超出的Java虚拟机栈的大小,StackOverflowError错误。
    • 移位运算的性能非常快。对于给定的正整数a和b,不难得到如下的结论。其中getGCB(a,b)的意思是a,b的最大公约数函数:

      当a和b均为偶数,gcb(a,b) = 2*gcb(a/2, b/2) = 2*gcb(a>>1, b>>1)

      当a为偶数,b为奇数,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b)

      当a为奇数,b为偶数,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1)

      当a和b均为奇数,利用更相减损术运算一次,gcb(a,b) = gcb(b, a-b), 此时a-b必然是偶数,又可以继续进行移位运算。

    public static void main(String[] args) {
            long timer = System.currentTimeMillis();
            System.out.println(getGCB(1934232340,234232265));
            System.out.println(System.currentTimeMillis() - timer);
        }
        private static int getGCB(int a, int b){
            if(a == b)
                return a;
            else if(a > b)
                return getGCB(b, a);
            else{
                if((a&1) != 1 && (b&1) != 1)
                    return getGCB(b >> 1, a >> 1)<<1;
                else if((a&1) != 1 && (b&1) == 1)
                    return getGCB(a >> 1, b);
                else if((a&1) == 1 && (b&1) != 1)
                    return getGCB(a, b>>1);
                else{
                    return getGCB(a, b -a);
                }
            }
        }
  • 相关阅读:
    Java实现字符串的包含
    Java实现字符串的包含
    Java实现字符串的包含
    Java实现字符串的包含
    Java实现字符串的包含
    穷文富理撑死工,得先学门能挣钱的手艺
    Windows更新清理工具 (winsxs 清理工具)
    SQLite实现内存键值存储
    Qt5.7.0移植到4412
    罗辑思维2014 第11集 迷茫时代的明白人(慢慢来,能做一点是一点),有书卖
  • 原文地址:https://www.cnblogs.com/zhanglei93/p/5962246.html
Copyright © 2020-2023  润新知