トピック: 2 つの整数を入力し、それらの最大公約数と最小公倍数を 4 つの異なるアルゴリズムで出力、複数入力
アルゴリズムの分析:
ブルートフォース方式は時間の複雑さが高く、推奨されません。
ローリング分割法と位相減算法は比較的単純で理解しやすく、時間の複雑さは高くありません。
Stein アルゴリズムの考え方は複雑です. 核となる考え方は: 2 つの数値を比較し、a > b であることを確認し、2 つの数値間のパリティ関係を通じてシフト演算または計算を実行することです。
ソースコード:
#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;
}