C++でLCMとHCFが与えられたときにもう一方の数を求める方法
ある数Aと、その最小公倍数(LCM)および最大公約数(HCF/GCD)の値が与えられているとき、もう一方の数Bを求める問題を考えます。例えば、A = 5、LCM = 25、HCF = 4が与えられた場合、もう一方の数は20になります。
この問題を解く鍵となるのは、任意の2つの数AとBの間に常に成り立つ次の重要な数学的性質です。
$$𝐴∗𝐵=𝐿𝐶𝑀∗𝐻𝐶𝐹$$
つまり、「2つの数の積」は「最小公倍数と最大公約数の積」と等しくなります。この式をBについて変形すると、次のようになります。
$$𝐵= \frac{LCM*HCF}{A}$$
アルゴリズム
- 数A、LCM、HCFの値を受け取ります。
- LCMとHCFを掛け合わせ、その結果をAで割ります。
- 計算結果をBとして返します。
コード例
#include <iostream>
using namespace std;
int anotherNumber(int A, int LCM, int GCD) {
return (LCM * GCD) / A;
}
int main() {
int A = 5, LCM = 25, GCD = 4;
cout << "Another number is: " << anotherNumber(A, LCM, GCD);
}出力
Another number is: 20
コードの解説
関数anotherNumberでは、引数として受け取ったLCMとGCDの積を計算し、それをAで割ることでBを求めています。この処理は1回の乗算と1回の除算だけで済むため、時間計算量はO(1)と非常に効率的です。
このように、LCMとHCFの基本的な性質を利用することで、複雑な探索を行わずとも、もう一方の数を簡単かつ高速に求めることができます。
-
【C++】グラフ内の橋(ブリッジエッジ)の数を検出するプログラムの解説
ブリッジエッジ(橋)とは? 重みなし無向グラフにおけるブリッジエッジ(橋)とは、その辺を取り除いたときにグラフが非連結(複数の連結成分に分断される)となるような辺のことです。本記事では、n個の頂点とm個の辺からなるグラフが与えられたとき、その中に含まれるブリッジの数を求めるC++プログラムを紹介します。なお、対象となるグラフには平行辺や自己ループは含まれないものとします。 問題の例 例として、n = 5、m = 6、edges = {{1, 2}, {1, 3}, {2, 3}, {2, 4}, {2, 5}, {3, 5}} という入力が与えられた場合を考えてみましょう。この場合の出力は
-
C++で文字列の順列の総数を求めるプログラムの作成方法
文字列に含まれる文字は、さまざまな順序で並べ替えることができます。本記事では、与えられた文字列から作成できる順列の数を求める方法を解説します。たとえば「abc」という3文字の文字列の場合、並べ方は 3! = 6 通りあります。つまり、n 文字の文字列であれば、最大で n! 通りの並べ方が存在します。しかし、「aab」のように同じ文字が複数回含まれている場合、単純に 6 通りにはなりません。「aab」の全パターンを書き出してみると、次のようになります。abaaabbaabaaaababaこのうち、(1番目と6番目)、(2番目と5番目)、(3番目と4番目) のペアはそれぞれ同一の並び方です。したが