最大公约数和最小公倍数

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);
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空空的司马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值