【C言語】最大公約数(GCD)と最小公倍数(LCM)を求めるプログラムの書き方
まずは、最大公約数(GCD)の基本から確認していきましょう。
最大公約数(GCD・HCF)とは
2つ以上の整数に共通する約数のうち、最も大きいものを「最大公約数」と呼びます。英語では Highest Common Factor(HCF)、Greatest Common Divisor(GCD)、Greatest Common Measure(GCM)などの名称で呼ばれますが、いずれも同じ概念を指します。
例として、「12と16の最大公約数」を求めてみましょう。
12の約数:1, 2, 3, 4, 6, 12 16の約数:1, 2, 4, 8, 16
両方の数に共通する約数は「1, 2, 4」で、その中で最大のものは4です。したがって、12と16の最大公約数(HCF)は4となります。
最小公倍数(LCM)とは
2つの整数 x と y に対する最小公倍数 LCM(x, y) とは、x と y のどちらの数でも割り切ることができる正の整数のうち、最も小さいものを指します。
例えば、次のようになります。
LCM(2, 3) = 6 LCM(6, 10) = 30
GCDとLCMを求めるCプログラム
以下のプログラムでは、ユークリッドの互除法を使って最大公約数(GCD)を求め、その値をもとに最小公倍数(LCM)を計算しています。
ユークリッドの互除法とは、「大きい方の数を小さい方の数で割った余り」と「小さい方の数」を新しい組み合わせとして、余りが0になるまで割り算を繰り返すアルゴリズムです。余りが0になったときの割る数が最大公約数になります。
また、最小公倍数は次の公式から求められます。
LCM(x, y) = (x × y) ÷ GCD(x, y)
サンプルコード
#include <stdio.h>
int main() {
int num1, num2, x, y, temp, gcd, lcm;
printf("Enter two integers\n");
scanf("%d%d", &x, &y);
num1 = x;
num2 = y;
/* ユークリッドの互除法でGCDを求める */
while (num2 != 0) {
temp = num2;
num2 = num1 % num2;
num1 = temp;
}
gcd = num1;
lcm = (x*y)/gcd;
printf("GCD of %d and %d = %d\n", x, y, gcd);
printf("LCM of %d and %d = %d\n", x, y, lcm);
return 0;
}実行結果
プログラムをコンパイルして実行すると、入力した2つの整数に対するGCD(最大公約数)とLCM(最小公倍数)が表示されます。
Run 1: Enter two integers 6 12 GCD of 6 and 12 = 6 LCM of 6 and 12 = 12 Run 2: Enter two integers 24 36 GCD of 24 and 36 = 12 LCM of 24 and 36 = 72
実行例1では、6と12の最大公約数が6、最小公倍数が12。実行例2では、24と36の最大公約数が12、最小公倍数が72と、それぞれ正しく計算できていることがわかります。
-
Pythonでリスト内の全要素の最大公約数(GCD)を求める方法
Pythonでは、mathモジュールのgcd()関数を活用することで、リスト内のすべての整数に共通する最大公約数(GCD:Greatest Common Divisor)を簡単に求めることができます。例えば、リスト nums = [15, 81, 78] が与えられた場合、15・81・78 のすべてを割り切れる最大の正の整数は 3 であるため、出力結果は 3 になります。解法のアプローチこの問題は、以下の手順で解決できます。リストの要素数が1つだけの場合は、その要素をそのまま返します。まず、最初の2つの要素 nums[0] と nums[1] の最大公約数を計算し、変数 div に格納します。
-
Pythonで合計がkの倍数となる長さ2以上の部分リストを検出する方法
非負の整数からなるリスト nums と、正の整数 k が与えられたとします。このとき、要素の合計が k の倍数になる「長さ 2 以上の部分リスト(サブリスト)」が存在するかどうかを判定します。 たとえば、入力が nums = [12, 6, 3, 4]、k = 5 の場合、出力は True になります。これは、部分リスト [12, 3] を選ぶと合計が 15 となり、5 で割り切れるためです。 アルゴリズムの考え方 この問題は、累積和の剰余(mod k)を利用することで効率的に解けます。ポイントとなるのは次の性質です。 「2つの累積和の剰余が等しい場合、その間にある要素の合計は必ず k の倍数