C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でn個の数のGCD(最大公約数)とLCM(最小公倍数)を求めるプログラム

本記事では、複数の整数からGCD(最大公約数)とLCM(最小公倍数)を求めるC++プログラムを解説します。

GCD(Greatest Common Divisor:最大公約数)とは、2つ以上の整数(すべてがゼロではないもの)に共通する約数の中で最大となる正の整数のことです。英語では Greatest Common Factor(最大公因子)とも呼ばれます。

一方、LCM(Least Common Multiple:最小公倍数)とは、2つの数のどちらの倍数にもなる数のうち、ゼロ以外で最小の数を指します。

アルゴリズム

まず、処理の流れを擬似コードで確認しましょう。GCDの計算には、剰余を繰り返し求める「ユークリッドの互除法」が使われています。

開始
  2つの数を入力として受け取る
  関数 gcd() を呼び出して GCD を求める
  関数 lcm() を呼び出して LCM を求める

  gcd(number1, number2)
   r, a, b を宣言する
   r = 0 を代入
   a = (number1 > number2) ? number1 : number2
   b = (number1 < number2) ? number1 : number2
   r = b
   (a % b != 0) の間繰り返す:
     r = a % b
     a = b
     b = r
   r を返す

  lcm(number1, number2)
   a を宣言する
   a = (number1 > number2) ? number1 : number2
   無限ループ:
     もし (a % number1 == 0 かつ a % number2 == 0) ならば
       a を返す
     a をインクリメント
終了

GCDの仕組み(ユークリッドの互除法)

大きい方の数を小さい方の数で割った余りを求め、次に「割る数」と「余り」のペアで同じ操作を繰り返します。余りが0になったときの割る数が最大公約数となります。

LCMの仕組み

大きい方の数から順に1ずつ増やしながら、両方の数で割り切れるかどうかを判定します。最初に両方で割り切れた値が最小公倍数です。

サンプルコード

#include<iostream>
using namespace std;
int gcd(int m, int n) {
    int r = 0, a, b;
    a = (m > n) ? m : n;
    b = (m < n) ? m : n;
    r = b;
    while (a % b != 0) {
        r = a % b;
        a = b;
        b = r;
    }
    return r;
}
int lcm(int m, int n) {
    int a;
    a = (m > n) ? m : n;
    while (true) {
        if (a % m == 0 && a % n == 0)
            return a;
        ++a;
    }
}
int main(int argc, char **argv) {
    cout << "Enter the two numbers: ";
    int m, n;
    cin >> m >> n;
    cout << "The GCD of two numbers is: " << gcd(m, n) << endl;
    cout << "The LCM of two numbers is: " << lcm(m, n) << endl;
    return 0;
}

実行結果

Enter the two numbers:
7
6
The GCD of two numbers is: 1
The LCM of two numbers is: 42

n個の数へ拡張するには

上記のコードは2つの数を扱いますが、次の性質を利用すれば3つ以上の数にも対応できます。

  • GCDの場合:gcd(a, b, c) = gcd(gcd(a, b), c)
  • LCMの場合:lcm(a, b, c) = lcm(lcm(a, b), c)

つまり、配列の先頭から順に2つずつgcd()やlcm()を適用していけば、任意の個数の整数についても最大公約数・最小公倍数を求められます。

  1. C++で三角形の重心を求めるプログラムの作成方法

    この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ

  2. C++で平行四辺形の面積を求めるプログラムの作成方法

    この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ