【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

求解最小公倍数和最大公约数是我们开始编程的时候经常需要练习的题目。从题面上看,好像我们需要求解的是两个题目,但其实就是一个题目。那就是求最大公约数?为什么呢?我们可以假想这两个数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)小问题看似简单,但是在不同的场景下却可以变得非常复杂,作为面试题可以充分考察面试者的沟通能力和应变能力。

一步一步写算法(之 最大公约数、最小公倍数)相关推荐

  1. 【数论算法】最大公约数 最小公倍数

    目录 1.概述 2.代码实现 2.1.最大公约数 2.2.最小公倍数 1.概述 (1)最大公约数 (Greatest Common Divisor, GCD),也称最大公因数.最大公因子,指两个或多个 ...

  2. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  3. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  4. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  5. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  6. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  7. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  8. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  9. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

  10. 一步一步写算法(之排序二叉树删除-3)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 3 普通节点的删除 3.1 删除的节点没有左子树,也没有右子树 测试用例1: 删除节点6 /* ...

最新文章

  1. 两个程序员的泰国普吉岛之行
  2. 二叉树的中序遍历(递归)
  3. MATLAB中floor、round、ceil、fix区别
  4. 底层实现_Redis有序集合zset的底层实现
  5. SAP Spartacus OrganizationState
  6. 有关EMMC、Nandflash、SSD、HDD的科普类说明
  7. 获得SD卡的剩余容量
  8. NUC1214 回文素数
  9. 机器学习——Day 1 数据预处理
  10. 清华计算机系超算团队,清华大学学生超算团队
  11. 破解sublime 3207(2019.6.3更新)
  12. 【电源专题】脉宽调制(PWM)与脉冲频率调制(PFM)
  13. 阿里云盘小白羊版!你值得拥有的一款第三方阿里云盘客户端
  14. 黑苹果0x0501_黑苹果原版安装从零开始---3-clover配置篇
  15. 华语金曲30年30歌
  16. 微博开源框架Motan初体验
  17. Android微信支付订单支付失败的问题
  18. 技术资料收集 技术大牛及网站推荐 待研究方向
  19. 请问机器学习算法岗中用户增长和推荐系统差别是什么呢?
  20. 3D地图+智能导航,用微信小程序轻松实现校园内导航

热门文章

  1. oracle单列索引和组合索引性能测试
  2. 数据结构C语言实现系列——线性表(线性表链接存储(单链表))
  3. Oracle数据库的DDL操作
  4. h3c s5500-28c-si操作
  5. [导入]PropertyGrid代码示例(Ext1.x)
  6. Sage CRM升级注意事项二
  7. 剑指Offer——和为s的两个数字
  8. CentOs6.6安装Python3
  9. Oracle学习系列1-7
  10. Android学习之——ListView下拉刷新