带你走进算法中的数学问题(最大公因数与最小公倍数)

166 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

引言

在考试中,数学问题是经常出现的一类问题,它们并不涉及很深的算法,但是和数学息息相关,接下来,我们将对日常考试中容易出现的一些数学问题进行总结,希望这篇文章能够带你打开程序设计的大门!!也祝大家考试取得好成绩!!

最大公因数与最小公倍数

最大公因数

  1. 基本了解:
    • 最大公因数:即a值和b值共有的所有因数中选取最大值
    • 通常情况下,gcd(a,b)用来表示a和b的最大公因数
  2. 那么如何求解最大公因数呢?我们采用辗转相除法,接下来我们介绍一下辗转相除法的具体思路:
    • 假设:a=k*b+r,k为 a/b 的商;r=a%b,即r是 a/b 的余数; d 是 a 和 b 的公因数
    • r= a%b =a-kb=md-knd=(m-kn)*d,得 d是 r=a%b 的因数
    • 得d 是 a 和 b 的公因数,也是 b和a%b的公因数
    • 由于d是a和b的任意因数,那么a 和 b 的公因数 就 是 b和a%b的公因数,同理可得b和a%b的公因数也是a 和 b 的公因数。
    • 因此a 和 b 的公因数与b和a%b的公因数全部相等
    • 综上:a和b的最大公因数也是a和a%b的最大公因数,即gcd(a,b)=gcd(b,a%b),此时使用递归即可

细心的你一定会发现以上过程并不严谨:如果a>b,进行以上操作,当a<b时,则只需要将a和b进行调换就好啦 此时,以上操作仍旧存在一个问题,就是递归到什么时候结束呢? 由于0和任意一个整数的a的最大公因数都是a,即递归到gcd(a,0)=a结束。 以下为最大公因数的关键代码

int gcd(int a,int b){
    if(b==0)  return a;
    else  return gcd(b,a%b);
}

最小公倍数

  1. 最小公倍数:即a值和b值所有的公有倍数中的最小值,通常最小公倍数用函数 lcm(a,b)表示
  2. 具体思路:
    • 解决最小公倍数在最大公因数的基础上进行
    • 计算出a,b的最大公因数d,求ab/d即为最小公倍数
    • 原因很简单:公倍数ab(公倍数是a和b的并集)一定是 a 和 b 的倍数, a 和 b 存在最大公因数 d(公因数是a和b的交集),公倍数ab在最大公因数d 部分会多计算一次,此时将 最大公因数d除掉得到的就是最小的公倍数

注意:ab计算时可能溢出,所以适当的写法应该是 a/bd。