求两数的最大公约数(三种方法)、最小公倍数

 前言:

最大公约数,这里介绍三种方法:辗转相除法,更相减损法,穷举法

最小公倍数,先求出最大公约数,再将最大公约数和两数相乘即可

辗转相除法

思路:

1.前提(操作数):输入两数为a,b设其中a做被除数,b做除数,temp为余数

2.步骤:

  • 第一步:大数放a中,小数放b中;
  • 第二步:求a/b的余数;
  • 第三步:若temp=0则b为最大公约数
  • 第四步:如果temp!=0则把b的值给a,temp的值给b;
  • 第五步:返回第二步。

实现代码:

#include

int main()
{
	int a = 0;
	int b = 0;

	while (scanf("%d%d", &a, &b) != eof)
	{
		//1.辗转相除法
		if (a < b)//确保大数放在a中
		{
			int tmp = b;
			b = a;
			a = tmp;
		}

		int c = a % b;
		while (c != 0)
		{
			a = b;
			b = c;
			c = a % b;
		}
		printf("%d\n", b);
	}

	return 0;
}

更相减损法

思路步骤:

  • 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步;
  • 第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
  • 第三步:则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

实现代码:

#include

int main()
{
	int a = 0;
	int b = 0;

	while (scanf("%d%d", &a, &b) != eof)
	{
		//2.更相减损法
		if (a < b)//确保大数放在a中
		{
			int tmp = b;
			b = a;
			a = tmp;
		}

		int cnt = 0;//计算两数能被2整除的次数
		while (a % 2 == 0 && b % 2 == 0)
		{
			cnt++;
			a /= 2;
			b /= 2;
		}
	
		int c = a - b;
		while (c != 0)
		{
			//比较b和c,每一次都要确保大数放在a中
			if (b < c)
			{
				int tmp = c;
				c = b;
				b = tmp;
			}

			a = b;
			b = c;
			c = a - b;
		}

		while (cnt)
		{
			b *= 2;
			cnt--;
		}
		printf("%d\n", b);
	}

	return 0;
}

穷举法

思路:

从两个数中较小数开始由大到小列举,直到找到公约数立即中断列举,得到的公约数便是最大公约数。

实现代码:

#include

int main()
{
	int a = 0;
	int b = 0;

	while (scanf("%d%d", &a, &b) != eof)
	{
		//3.穷举法(枚举)
		if (a < b)//确保大数放在a中
		{
			int tmp = b;
			b = a;
			a = tmp;
		}

		int temp = b;//从较小的一个数开始枚举
		while (temp != 0)
		{
			if (a % temp == 0 && b % temp == 0)
			{
				break;
			}
			temp--;
		}
		printf("%d\n", temp);
	}

	return 0;
}

推荐指数

求最大公约数的三种方法,推荐指数:穷举>辗转相除>更相减损

你可能感兴趣的:(学习C语言相关知识,算法,蓝桥杯)