最大公约数和最小公倍数详解

一、最大公约数

题目链接:最大公约数__牛客网 (nowcoder.com)

(1)遍历法

当给出两个数时,这两个数的最大公约数一定小于等于这两个数中较小的数,例如:12 和 24 的 最大公约数是12;

所以我们先知道这俩个数(m>n)的较小值i=n,然后观察m和n 能否整除i, 如果可以则 i 就是这俩个数的最大公约数;如果不能整除就将 i 减一,然后观察m和n 能否整除i,依次重复,知道找到能被这两个数同时整除的数,而这个数就是最大公约数。所以这里需要用循环来实现。

代码如下:

#include <stdio.h>

int main()
{
	int num1 = 0, num2 = 0;
	scanf("%d %d", &num1, &num2);
	int min = num1 < num2 ? num1 : num2;
	while (1)
	{
		if (num1 % min == 0 && num2 % min == 0)
			break;
		else
			min--;
	}
	printf("%d\n", min);
	return 0;
}

(2)欧几里得算法(辗转相除法)

a%b=c, 如果 c 等于零 则 b 就是最大公约数;

如果c 等于零,就把 b 的值赋给a,c的值赋给b进行运算, 即 b%c=d,观察d 是否为0,如果为零,则c就是最大公约数,如果不是就重复操作(也就是循环)。

也就是说,两个数相除,当余数为0时,被除数就是这两个数的最大公约数

所以6就是24 和 18的最大公约数。

代码如下:


#include <stdio.h>

int main()
{
	int num1 = 0, num2 = 0;
	scanf("%d %d", &num1, &num2);
	int min = num1 < num2 ? num1 : num2;
	int max = num1 > num2 ? num1 : num2;
	int ret = min;
	while (ret=max%min)
	{
		max = min;
		min = ret;
	}
	printf("%d\n", min);
	return 0;
}

这两种方法,第一种遍历法比较容易理解,但是效率较低;第二种方法不容易自己想到,但是效率高。

二、最小公倍数

题目链接:最小公倍数__牛客网 (nowcoder.com)

(一)遍历法

同样求最小公倍数也可以使用遍历法,两个数的最小公倍数一定大于等于这两个数的较大数,

例如:12 和 24 的 最小公倍数是24;

所以我们先知道这俩个数(m>n)的较大值i=m,然后观察i能否整除m和n , 如果可以则 i 就是这俩个数的最大公约数;

如果不能整除就将 i 加一,然后观察i能否整除m和n ,依次重复,知道找到能同时整除这两个数的数,而这个数就是最小公倍数。所以这里需要用循环来实现。

代码如下:

#include <stdio.h>

int main()
{
	int num1 = 0, num2 = 0;
	scanf("%d %d", &num1, &num2);
	int max = num1 > num2 ? num1 : num2;
	while (1)
	{
		if (max % num1 == 0 && max % num2 == 0)
			break;
		max++;
	}
	printf("%d\n", max);
	return 0;
}

(二)利用最大公约数

最小公倍数=两个数的乘积/最大公约数

例如:24 和 18 的最大公约数是6,俩个数的乘积432,则最小公倍数为:432/6=72;

而最大公约数可以利用欧几里得算法求得。

代码如下:

#include <stdio.h>

int main()
{
	int num1 = 0, num2 = 0;
	scanf("%d %d", &num1, &num2);
	int min = num1 < num2 ? num1 : num2;
	int max = num1 > num2 ? num1 : num2;
	int ret = min;
	while (ret=max%min)
	{
		max = min;
		min = ret;
	}
	printf("%d\n", (num1*num2)/ min);
	return 0;
}

如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值