1、最大公约数
最大公约数就是两个数共同的因子中,最大的那一个。百度百科上搜到一个算法流程图:
根据上述算法流程图可以写得如下的代码:
int gcs(int a, int b)
{
int r;
if(a < b) //确保a比b大
{
r = a;
a = b;
b = r;
}
r = b;
while(r != 0)
{
r = a%b;
a = b;
b = r;
}
return a;
}
思考:两个数的公因子必定要小于或者等于这两个数中较小的那个数,这个是毫无疑问的。(记输入的较大的数为去,较小的数为b)
1、如果较大的数正好能被较小的数整除的话,那么说明最大公约数就是较小的那个整数。
2、如果不能被整除,那么就可以缩小范围求取b 和 a%b 这两个数的公约数了。如此下去,递归的思想就出来了。
Tips: 其实上述过程就是欧几里德算法, 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
gcd(a,b) = gcd(b,a mod b)
int gcd(int a,int b)
{
return a%b?gcd(b,a%b):b;
}
当然,上述代码的前提就是a要不小于b;
2、最小公倍数
最小公倍数是两个数公共倍数总最小的那一个数。有公式:
由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)× [a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
那么调用上述的最小公约数函数就可以得到最小公倍数了:
int msc(int a,int b)
{
return a*b / gcd(a,b);
}