题目:输入两个整数, 通过四种不同算法输出他们的最大公约数和最小公倍数, 多组输入
算法分析:
暴力穷举法时间复杂度高,不推荐;
辗转相除法和更相减损法相对简单,容易理解,时间复杂度不高;
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;
}