求最大公约数与最小公倍数

最大公约数与最小公倍数

最大公约数

1,试除法
假设给定两个数a和b,最大公约数肯定小于等于min{a,b},我们用a和b取与他们之间较小的数如果结果不等于0,min{a,b}就自减。

//
int main()
{
	int a = 18;
	int b = 24;
	int min = (a > b ? b: a);
	while (a % min || b % min)
	{
		min--;
	}
	printf("%d", min);
	return 0;
}

2,辗转相除法
给定a,b,再定义一个变量c等于a%如果C不等于0,那么就把b的值赋给a,c的值赋给b,以此往复下去。最后的最大公约数就是b。

// 
int main()
{
	int a = 18;
	int b = 24;
	int c = 0;
	while (c = a % b)
	{
		a = b;
		b = c;
	}
	printf("%d\n", b);
	return 0;
}

3,上述的代码还可以写成一种递归的模式。

//
int GCD(int a, int b)
{
	if (0 == a % b)
		return b;
	else
		GCD(b, a % b);
}
int main()
{
	int a = 18;
	int b = 24;
	int ret=GCD(a, b);
	printf("%d\n", ret);
	return 0;
}

4,辗转相减法

// 
int main()
{
	int a = 18;
	int b = 24;
	while (a != b)
	{
		if (a > b)
			a = a - b;
		else
			b = b - a;
	}
	printf("%d\n", a);
	return 0;
}

5,同样上述的方法也可以写成递归的方式

// 
int GCD(int a, int b)
{
	if (a == b)
		return a;
	else if (a > b)
		GCD(a - b, b);
	else
		GCD(b - a, a);
}
int main()
{
	int a = 18;
	int b = 24;
	int ret = GCD(a, b);
	printf("%d\n", ret);
	return 0;
}

最小公倍数

1,首先也介绍试除法
假定a,b,最小公倍数肯定大于等于max{a,b},所以我们用max对a,
b进行%,如果结果不等于0,max就自增,知道取余的结果为0.

// 
int main()
{
	int a = 18;
	int b = 24;
	int max = (a > b ? a : b);
	while (max % a || max % b)
	{
		max++;
	}
	printf("%d\n", max);
	return 0;
}

2,假设最小公倍数为m,那么有m/a=i;m/b=j;此时我们用a✖n(n从1开始不断自增)%b,结果为0时,最小公倍数就是a*n;

// 
int main()
{
	int a = 18;
	int b = 24;
	int n = 1;
	while (a * n % b)
	{
		n++;
	}
	printf("%d\n", a * n);
	return 0;
}

3,最小公倍数等于两个数等乘积除以最大公约数
这里我们用上述的辗转相除法为例。

// 
int main()
{
	int a = 18;
	int b = 24;
	int c = 0;
	int m = a;
	int n = b;
	while (c = a % b)
	{
		a = b;
		b = c;
	}
	printf("%d\n", m * n / b);
	return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大理寺j

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

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

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

打赏作者

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

抵扣说明:

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

余额充值