C++で再帰やユークリッドの互除法を使わずに2つの数の最大公約数(HCF)を求める方法
最大公約数(HCF、GCDとも呼ばれます)は、通常「ユークリッドの互除法」を使えば簡単に計算できます。しかし、この記事では、ユークリッドの互除法や再帰的なアルゴリズムに頼らずに、GCD(HCF)を求める方法を紹介します。例として、16と24という2つの数を考えます。この2つの数の最大公約数は8です。
アルゴリズムの考え方
ここでのアプローチは非常にシンプルです。手順は以下のとおりです。
1. まず、2つの数のうち小さい方の値を取得します。
2. 大きい方の数が小さい方の数で割り切れる場合、その小さい方の数がそのままHCFとなります。
3. 割り切れない場合は、小さい方の数の半分(min / 2)から2まで順に値を減らしながら調べていき、現在の値が両方の数を割り切れた時点で、その値がHCFとなります。
4. どの値でも割り切れなかった場合は、1がHCFとなります。
この方法は直感的で理解しやすく、再帰呼び出しや剰余演算を繰り返すユークリッドの互除法とは異なるアプローチです。ただし、計算量はO(min(a, b))程度となるため、非常に大きな数を扱う場合はユークリッドの互除法の方が効率的である点に注意してください。
サンプルコード
#include <iostream>
using namespace std;
int gcd(int a, int b) {
int min_num = min(a, b);
if (a % min_num == 0 && b % min_num == 0)
return min_num;
for (int i = min_num / 2; i >= 2; i--) {
if (a % i == 0 && b % i == 0)
return i;
}
return 1;
}
int main() {
int a = 16, b = 24;
cout << "HCF: "<< gcd(a, b);
}
実行結果
HCF: 8
コードの解説
このプログラムでは、まずmin()関数を使って2つの数のうち小さい方をmin_numとして取得します。次に、min_numが両方の数を割り切れるかどうかを確認し、割り切れればその値を返します。割り切れない場合は、min_num / 2から2までループを回しながら、両方の数を割り切れる最初の値を探します。16と24の場合、小さい方の16を24が割り切れないため、8から順に調べていき、8が両方を割り切れるため8が結果として出力されます。
-
再帰を使用して自然数の合計を求めるC++プログラム
自然数とは、1から始まる正の整数のことです。自然数の列は以下のように表されます。1, 2, 3, 4, 5, 6, 7, 8, 9, 10……本記事では、再帰(リカージョン)を利用して、最初のn個の自然数の合計を求めるC++プログラムを紹介します。再帰とは、関数が自分自身を呼び出すことで問題を段階的に解決していく手法です。サンプルコード以下は、再帰を使って最初のn個の自然数の合計を計算するC++プログラムの例です。#include <iostream> using namespace std; int sum(int n) { if(n == 0) &nb
-
C++で再帰を使って最大公約数(GCD)を求めるプログラム
2つの数の最大公約数(GCD:Greatest Common Divisor)とは、その両方の数を割り切ることができる最大の整数のことです。例として、63と42という2つの数を考えてみましょう。63 = 7 × 3 × 3 42 = 7 × 3 × 2 したがって、63と42のGCDは 21このように、共通する約数は「7」と「3」であり、その積である21が最大公約数となります。ここでは、再帰(リカージョン)を使って2つの数のGCDを求めるC++プログラムを2つの方法で紹介します。方法1:減算による再帰1つ目の方法は、大きい方の数から小さい方の数を引く操作を再帰的に繰り返すアプローチです。これは