Javaで数値配列の最小公倍数(LCM)を求める方法
L.C.M.(最小公倍数、Least Common Multiple)とは、2つ以上の値のどちらの倍数にもなる最小の正の整数のことです。
例として、3と4の倍数を並べてみましょう。
3 → 3, 6, 9, 12, 15 ...
4 → 4, 8, 12, 16, 20 ...
両方に共通する最小の倍数は12なので、3と4の最小公倍数は12になります。
最小公倍数の求め方のポイント
配列内のすべての数値の最小公倍数を求める場合は、2つの数の最小公倍数を順番に計算して畳み込んでいく方法が効率的です。最小公倍数は、最大公約数(GCD)を使って次の式で求められます。
LCM(a, b) = a × b ÷ GCD(a, b)
最大公約数は「ユークリッドの互除法」と呼ばれる古典的なアルゴリズムを使うと、非常に効率よく計算できます。
プログラム
以下の例では、整数配列の最小公倍数を計算しています。
public class LCMofArrayOfNumbers {
// 最大公約数(GCD)をユークリッドの互除法で求める
static int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
// 2つの数の最小公倍数(LCM)を求める
static int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
public static void main(String args[]) {
int[] myArray = {25, 50, 125, 625};
int lcm = myArray[0];
// 配列の先頭から順に、これまでのLCMと次の要素のLCMを計算
for (int i = 1; i < myArray.length; i++) {
lcm = lcm(lcm, myArray[i]);
}
System.out.println("配列の数値の最小公倍数 : " + lcm);
}
}実行結果
配列の数値の最小公倍数 : 1250
プログラムの解説
1. ユークリッドの互除法によるGCD計算
gcdメソッドは、2つの数の最大公約数をユークリッドの互除法で求めます。剰余計算を繰り返し、余りが0になった時点の値が最大公約数となります。計算量は非常に少なく、大きな数でも高速に処理できます。
2. GCDを利用したLCM計算
lcmメソッドでは「a ÷ GCD(a, b) × b」という順序で計算しています。先に割り算を行うことで、掛け算の中間値が大きくなりすぎてint型の範囲を超える(オーバーフローする)のを防いでいます。
3. 配列全体への展開
配列の最初の要素を初期値とし、2番目以降の要素と順にLCMを計算していくことで、配列全体の最小公倍数が求められます。この例では、LCM(25, 50) = 50、LCM(50, 125) = 250、LCM(250, 625) = 1250 と計算が進み、最終的な結果は1250になります。
この手法を使えば、3つ以上の任意の個数の数値に対しても、同じロジックで最小公倍数を正確に求めることができます。
-
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
-
JavaでList(リスト)を配列に変換する方法|toArray()とArrays.asList()の使い方
Javaの開発において、List(リスト)と配列(Array)の相互変換は非常によく使われる基本的な操作です。 Listを配列に変換する最も簡単かつ推奨される方法は、.toArray()メソッドを使うことです。逆に、配列をListに戻したい場合は、Arrays.asList()メソッドを使用します。 以下では、文字列(String)のListや整数(Integer)のListを、それぞれ対応する配列に変換する具体例を紹介します。 String型のListを配列に変換する import java.util.ArrayList; import java.util.List; public cl