C++算法之求最大公约数和最小公倍数

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

求解最小公倍数和最大公约数是我们开始编程的时候经常需要练习的题目。从题面上看,好像我们需要求解的是两个题目,但其实就是一个题目。那就是求最大公约数?为什么呢?我们可以假想这两个数m和n,假设m和n的最大公约数是a。
那么我们可以这样写:
    m = b *a;
    n = c * a;
    所以m和n的最小公倍数就应该是a*b*c啊,那不就是m * n / a,其中m和n是已知的,而a就是那个需要求解的最大公约数。所以就有了下面的代码
int GetMinCommonMultiple(int m,int n)  
{  
    assert(m && n);  
  
    return m * n / GetMaxCommonDivide(m,n);  
}  
    下面就可以开始最大公约数的求解。其实,关于最大公约数的求解,大家看到的更多是各种捷径,比如说欧几里得法。欧几里得法构思十分巧妙,它利用了m、n和n、m%n之间的最大公约数是相等的这一重要条件,充分利用替换的方法,在 m%n等于0的那一刹那,获得我们的最大公约数。然而,我们平时自己所能想到的方法却不多,下面的方法就是具有典型意义的一种:
    a) 首先对数据m和n判断大小,小的赋值给smaller,大的赋值给larger
    b)index索引从2开始到smaller遍历,发现有没有数据可以同时被两者整除,有则更新数据
    c)循环结束后,获取最大的公约数
int GetMaxCommonDivide(int n,int m)  
{  
    int index;  
    int smaller;  
    int larger;  
    int value;  
    assert(n && m);  
  
    if(n > m){  
        larger = n;  
        smaller = m;  
    }else{  
        larger = m;  
        smaller = n;  
    }  
  
    value = 1;  
    for(index = 2; index <= smaller; index++){  
        if(0 == (smaller % index) && 0 == (larger % index))  
            value = index;  
    }  
  
    return value;  
}  

 
    上面的代码看似没有问题,但是还是留下了一个遗憾,如果m和n的数据都大于32位,那怎么办?也许有的朋友会说,现在有64位的cpu。但是如果我们此刻没有64位的cpu,那该怎么办呢?

总结:
    (1)看似最大公约数、最小公倍数是个小问题,但是要写好不容易,算法、参数判断、逻辑都要注意,
    (2)如果m和n的数据都比较大,有没有可能利用多核降低计算的复杂度,
    (3)如果m和n中有数据大于32位,那该怎么办?
    (4)小问题看似简单,但是在不同的场景下却可以变得非常复杂,作为面试题可以充分考察面试者的沟通能力和应变能力。

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...