• java常见面试题2:求出两个正整数的最大公约数


    概念:

    最大公约数:两个整数共有因子中最大的一个

     

    方法一:

    如果两个数相等,则最大公约数为它本身,两个数不等,则用两个数依次除 两个数中最小的一个到 1,直到找到同时能被两个数除尽的那个数

    代码清单:

           public static int gcd1(int x, int y) {
            int result = 0; // 最大公约数
            int min = x > y ? y : x; // 两个整数中最小的数
            if (x == y) {
                result = x;
            } else {
                for (int i = min; i >= 1; i--) {
                    if (x % i == 0 && y % i == 0) {
                        result = i;
                        break;
                    }
                }
            }
            return result;
        }

    方法二:辗转相除法

    假设用f(x,y) 表示x , y 的最大公约数,取 k = x/y , b = x%y ,则 x = ky + b ,如果一个数能够同时整除  和 y ,则 和 的公约数与 和 的公约数是相同的,其最大公约数也是相同的,则有 f(x,y) = f(y , x%y)  (x>=y>0)。如此便可把原问题转化为求两个更小数的最大公约数,知道其中的一个数为0,剩下的另外一个数就是两者的最大公约数。

    示例如下:

    F(42,30) = F(30,12) = F(12,6) = F(6, 0) = 6

    代码清单:

    public static int gcd2(int x, int y) {
        return (y == 0) ? x : gcd(y, x % y);
    } 

     

    方法三:

    方法二中用到了取模运算。但对于大整数而言,取模运算(用到除法)是非常昂贵的开销。能不能不用取模式运算呢?

    采用类似辗转相除法的分析,如果一个数能同时整除x,则必能同时整除x-yy

    和 的公约数和 x - y 和 y的公约数是相同的,其最大公约数也是相同的。即

    F(x , y)  = F (x-y , y) 

    示例如下:

    F(42,30) = F(30,12) = F(12,18) = F(18, 12)= F( 12 ,6 ) = F( 6, 6) = F( 6, 0) = 6

    代码清单:

    public int gcd3(int x, int y) {
            if (x < y) {
                return gcd3(y, x);
            }
            if (y == 0) {
                return x;
            } else {
                return gcd3(y, x-y);
            }
    }

     

     

  • 相关阅读:
    很简单的字节转换函数
    PHP获取用户操作系统信息
    PHP调用COM获得服务器硬件信息
    杂碎记录
    Math类使用记录
    hbase命令使用记录
    shell脚本学习
    多个job存依赖关系如何使用
    hbase的API并且使用多个rowkey分段直接读取数据
    shell学习记录
  • 原文地址:https://www.cnblogs.com/onway/p/3438950.html
Copyright © 2020-2023  润新知