2つの数値の最小公倍数(LCM)を求めるアルゴリズム
数学において、最小公倍数(LCM:Least Common Multiple)とは、2つの数値のどちらによっても割り切れる最小の正の整数のことです。
LCMは素因数分解など、さまざまな方法で計算できます。この記事で紹介するアルゴリズムでは、大きい方の数値に 1、2、3…n と順に掛けていき、もう一方の数値で割り切れる数が見つかった時点で、それをLCMとして返すというシンプルなアプローチを採用しています。
入力と出力
入力: 2つの数値:6 と 9 出力: LCMは:18
アルゴリズム
手続きは LCMofTwo(a, b) として定義します。
入力: 2つの数値 a と b(a > b と仮定します)。
出力: a と b の最小公倍数。
Begin
lcm := a
i := 2
while lcm mod b ≠ 0, do
lcm := a * i
i := i + 1
done
return lcm
End処理の流れ
- まず lcm を大きい方の数 a で初期化します。
- lcm が b で割り切れない間、a に 2、3、4… を掛けた値を lcm に代入していきます。
- lcm が b で割り切れた時点でループを抜け、その値を結果として返します。
C++による実装例
#include<iostream>
using namespace std;
int findLCM(int a, int b) { // a の方が b より大きいと仮定
int lcm = a, i = 2;
while(lcm % b != 0) { // b の倍数となる数を探索
lcm = a*i;
i++;
}
return lcm; // a と b の LCM
}
int lcmOfTwo(int a, int b) {
int lcm;
if(a>b) // 第1引数が大きくなるように入れ替え
lcm = findLCM(a,b);
else
lcm = findLCM(b,a);
return lcm;
}
int main() {
int a, b;
cout << "Enter Two numbers to find LCM: "; cin >> a >> b;
cout << "The LCM is: " << lcmOfTwo(a,b);
}このコードでは、findLCM 関数が実際の計算を行い、lcmOfTwo 関数が2つの引数の大小を比較して、大きい方を第1引数として渡す役割を担っています。
実行結果
Enter Two numbers to find LCM: 6 9 The LCM is: 18
6 と 9 の場合、6 × 1 = 6、6 × 2 = 12 はどちらも 9 で割り切れませんが、6 × 3 = 18 は 9 で割り切れるため、LCMは 18 となります。
-
2つの整数の最大公約数(GCD)を求める方法|ユークリッドの互除法をC++で解説
数学において、最大公約数(GCD:Greatest Common Divisor)とは、2つの整数をどちらも割り切ることができる整数のうち、最も大きいものを指します。なお、GCDを求める対象となる数はゼロ以外である必要があります。本記事では、古典的かつ効率的な手法であるユークリッドの互除法(Euclidean Algorithm)を用いて、2つの数のGCDを求める方法を解説します。入力と出力の例まず、プログラムの動作イメージをつかむために、具体的な入力と出力の例を見てみましょう。入力: 2つの数 51 と 34 出力: GCDは: 17この例では、51と34の両方を割り切れる最大の整数は17で
-
2進数同士の乗算を最速で行う方法 ― 分割統治法による効率的なアルゴリズム
2つの数が2進数(バイナリ)の文字列として与えられたとき、それらの積をいかに速く、効率的に求めるか。本記事ではその手法を詳しく解説します。 この問題は分割統治法(Divide and Conquer)を用いることで、非常に高い効率で解決できます。基本的なアイデアは、それぞれの数を前半と後半の2つの部分に分割し、部分ごとの結果を組み合わせて全体の積を得ることです。 ここで、最初の数 X を Xleft と Xright に、2番目の数 Y を Yleft と Yright に分割すると、積は次のように表されます。 さらに計算をシンプルにするため、上式は次のように変形できます。 この手法は