【算法】最大公约数/最小公倍数的四种算法

题目:输入两个整数, 通过四种不同算法输出他们的最大公约数和最小公倍数, 多组输入

算法分析:

暴力穷举法时间复杂度高,不推荐;

辗转相除法和更相减损法相对简单,容易理解,时间复杂度不高;

stein算法思路复杂,核心思想是:比较两个数,保证a > b,通过两个数的奇偶关系进行移位操作或者运算

源码:

#include <iostream>
using namespace std;

// 辗转相除法
int gcd_1(int a, int b)
{
	if (a % b == 0)
		return b;
	return gcd_1(b, a % b);
}

// 更相减损法
int gcd_2(int a, int b)
{
	if (a == b)
		return a;
	else if (a > b)
		return gcd_2(a - b, b);
	else
		return gcd_2(a, b - a);
}

// 暴力穷举法
int gcd_3(int a, int b)
{
	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	int i = b;
	for (; i > 0; --i)
	{
		if (a % i == 0 && b % i == 0)
			return i;
	}
	return 1;
}

// stein算法
int gcd_4(int a, int b)
{
	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	if (a % b == 0)
		return b;
	if (a % 2 == 0 && b % 2 == 0)
		return 2 * gcd_4(a >> 1, b >> 1);
	else if (a % 2 == 0 && b % 2 != 0)
		return gcd_4(a >> 1, b);
	else if (a % 2 != 0 && b % 2 == 0)
		return gcd_4(a, b >> 1);
	else
		return gcd_4(b, (a - b) >> 1);
}

int main()
{
	int x, y;
	cin >> x >> y;
	
	cout << "the res1: gcd=" << gcd_1(x, y) << ", lcm=" << x * y / gcd_1(x, y) << endl;
	cout << "the res1: gcd=" << gcd_2(x, y) << ", lcm=" << x * y / gcd_2(x, y) << endl;
	cout << "the res1: gcd=" << gcd_3(x, y) << ", lcm=" << x * y / gcd_3(x, y) << endl;
	cout << "the res1: gcd=" << gcd_4(x, y) << ", lcm=" << x * y / gcd_4(x, y) << endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/phoenixFlyzzz/article/details/130436235