最小公倍数与最大公因数

前言:原本我想分为两次发布,但是嘞想一下还是合二为1吧。

目录

最小公倍数

1.直接法(硬求)

2,方法二(名字叫不出来)

最大公因(约)数

1.直接法。

2.更相减损法(我也不知道为撒叫这个)

3,辗转相除法


最小公倍数

1.直接法(硬求)

公倍数:就是一个数分别除去两个数,能除的尽的数。(大俗话)

就拿12与16举例(比较好口算哈哈哈)他们的最小公倍数肯定在16及以上,然后在192之间找。

int main() {
	int a = 0;
	int b = 0;
	int i = 0;
	scanf("%d %d", &a, &b);
 int m=(a>b?a:b);//三母操作符,把最大值,放在m里
	for ( i = m; i <=(a*b); i++)
	{
		if (((i % a) == 0 && (i % b) == 0)) {
			printf("%dn", i);
			break;
		}
	}
	return 0;
}

2,方法二(名字叫不出来)

定义两个数a和b,在定义i从1开始依次++,用i*a,如果这个数%b如果等于0的话,这i*a不就是这a和b的最小公倍数嘛。听不懂的话,可以自己随便找两个数试一试,别太大,不然算的很累的。

int main() {
	int a = 0;
	int b = 0;
	int i = 1;
	scanf("%d %d", &a, &b);
	while ((i*a)%b!=0)
	{
		i++;
	}
	printf("%d", i * a);	
	
	return 0;
}

也可以去牛客网去验证一下,https://www.nowcoder.com/practice/22948c2cad484e0291350abad86136c3?tpId=37&&tqI


最大公因(约)数

公因(约)数:就是两个数同时除以一个数并且能除的尽的(大白话介绍)。

1.直接法。

也就是硬求,最小公约数反正在1到最小值之间。

int main() {
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int  min = (n < m ? n : m);//把最小值赋给min,
	while (min>0)
	{
		if (n % min == 0 && m % min == 0) {
			break;
		}
		min--;
	}
	printf("%d", min);
	return 0;
 }

2.更相减损法(我也不知道为撒叫这个)

随意两个数,先判断是否都是偶数,若是同时除去2,直到有一个不是偶数为止。如果不是那就以最大的数减去最小的数,接着用所得的差与与较小的比较,然后继续这个操作,直到减数与差数相同,然后这个差数就是最小公因数。如果开头都是偶数的话,还要拿这个公因数乘上约去多少个2。举列子来说明吧63与42,都不是偶数。

63-42=21

42-21=21

21-21=0

所以21就是他们的最大公因数。

举例都是偶数 32与24他们同时除2的次数,然后化为4和3

4-3=2

3-2=1

2-1=1

1-1=0

所以他们的最大公约数为1*2*2*2=8

int	 main() {
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int sum = 1;
	int ret = 0;
	while ((n%2==0) && (m%2==0))//判断是否都为偶数
	{
		n = n / 2;
		m = m / 2;
		sum *= 2;//约去多少个2
	}
	while (1)
	{
		if (n == m) {//如果二者都相同的情况下。
			ret = n;
			break;
		}
		if (n<m)//永远让最大的数为减数
		{
			int tmp = m;
			m = n;
			n = tmp;
		}
		 ret = n - m;
		if ( ret==m)
		{
			break;
		}
		else
		{
			n = m;
			m = ret;
		}
	}
	printf("%d", ret * sum);
	return 0;
}

前两种办法看似没有问题但是在牛客的通过率一个是

 一个是

 我到现在不知道为啥子,唉,但是也不代表他们没啥用,我在vs2019的平台下,输入各种数字尝试都没有问题,但是在牛客网唉~

3,辗转相除法

两个整数最大公约数等于其中较小的那个数两数相除余数最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。(百度一下)

直接举例48与36

48/36=1余12

36/12=3余0 

所以12为他们的最大公约数,也就是原本的被除数变成除数与余数反复相除,最后余数为0。

int  Come(int n, int m) {
	int z = n % m;  //判断是否一开始就为0
	while (z)
	{
		n = m;
		m = z;
		z = n % m;
	}
	return m;
}
int main() {
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int ret = Come(n, m);
	printf("%d", ret);
	return 0;
}

这个方法在牛客网通过率为百分之百哦

网站为https://ac.nowcoder.com/acm/problem/22215?&headNav=www 

总结:其实还有很多方法求最小公倍数,和最大公因数,我列出的方法都是最常见的,而且很适合刚学习时的人(每错,就是我)。今天加到这里啦。感谢观看

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>