16

面试官:来写个代码求一下两个数的最大公约数吧

 3 years ago
source link: http://www.cnblogs.com/exzlc/p/13615562.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近去面试了,面了几家公司,深刻认识到一个道理,越是基础的问题越重要,越能考察一个人的技术功底与逻辑思维。比如我们接下来要说的 求两个数的最大公约数 的问题。这类简单的算法题目一般会出现在面试环节,面试官要求你当场手撕的那种。

言归正传,首先我们要知道面试官出 求两个数的最大公约数 这个题目的目的是什么。知己知彼,才能百战不殆嘛。这个问题首先考察的是 候选人的数学功底 ,就是看你知不知道一些求公约数的算法,比如辗转相除法、更相减损法等;其次就是考察你的代码能力了,看你能不能把算法用代码写出来,写的代码有没有bug,注没注意边界的处理等等。下面我们分别来看一下,不同的候选人会有什么样的表现。

第一种,数学功底不扎实的,不知道目前已有的求公约数的方法,那估计只能写出下面这种代码了。

//暴力求解
   private static int getCommonDivisor(int m,int n){
        //非法参数的处理
        if(m <= 0 || n <= 0){
            return -1;
        }
        int min = Math.min(m,n);
        int res = 1;
        for(int i = 1;i <= min;i ++){
            if(m % i == 0 && n % i == 0){
                res = i;
            }
        }
        return res;
   }

这种就是暴力求解,不做过多解释了。面试官显然不会满意这种代码。

第二种,知道一些求公约数的算法,但是无法用代码实现,这种属于代码功力不够的,估计只能回家等通知了。

第三种,知道求公约数的算法,并且能写出代码的。比如说告诉面试官知道 更相减损法 可以求解,基本原理是 以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。 一般这时候面试官就会表示赞许,然后让你代码实现下,接着你就写出了如下的代码:

//更相减损法
private static int getCommonDivisor2(int m,int n){
    //非法参数的处理
    if(m <= 0 || n <= 0){
        return -1;
    }
    while(m != n){
        if(m > n){
            m = m - n;
        }else{
            n = n - m;
        }
    }
    return m;
}

怎么样,是不是很简洁!

当然,你也可以用辗转相除法实现,其基本原理是 两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数 。代码如下:

//辗转相除法
//两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数
private static int getCommonDivisor3(int m,int n){
    //非法参数的处理
    if(m <= 0 || n <= 0){
        return -1;
    }
    if(m < n){
        int temp = m;
        m = n;
        n = temp;
    }
    int c = m % n;
    while(c != 0){
        m = n;
        n = c;
        c =  m % n;
    }
    return n;
}

一般情况下,能说出最熟悉的一种方法并给出其具体实现就可以了,这道题目基本就过关了。

最后,其实求最大公约数的方法还有很多,比如质因数分解法、短除法等等,大家感兴趣的话可以多去了解下,扩展下自己的思维。

觉得文章有用的话, 点赞 + 关注 呗,好让更多的人看到这篇文章,也激励博主写出更多的好文章。

更多关于 算法、数据结构和计算机基础知识 的内容,欢迎扫码关注我的原创公众号「 超悦编程 」。

rUFfy2f.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK