【C++】合計と最大公約数(GCD)が与えられた2つの数を求める方法
この記事では、2つの数 a と b の合計(sum)と最大公約数(GCD)が与えられたときに、元の2つの数を復元する方法を解説します。条件を満たす組み合わせが存在しない場合は -1 を返します。
例えば、合計が 6、GCDが 2 とすると、答えは 4 と 2 になります(4 + 2 = 6、gcd(4, 2) = 2 を満たすため)。
考え方(アプローチ)
GCDが分かっているということは、2つの数がどちらもGCDの倍数であることが確定します。この性質を利用すると、次の手順で答えを導き出せます。
候補の生成: 片方の数をGCDそのものと仮定すると、もう片方は「合計 − GCD」となります。
検証: 仮定した2つの数の実際のGCDを計算し、与えられたGCDと一致するかどうかを確認します。また、合計がGCDと等しい場合(=もう片方が0になる場合)は不正なペアとなるため除外します。
出力: 条件を満たしていれば小さい方・大きい方の順で2つの数を出力し、満たさなければ
-1を出力します(そのような数の組は存在しないため)。
C++での実装例
#include <iostream>
#include <algorithm>
using namespace std;
void printTwoNumbers(int s, int g) {
if (__gcd(g, s - g) == g && s != g)
cout << "first number = " << min(g, s - g)
<< "\nsecond number = " << s - min(g, s - g) << endl;
else
cout << -1 << endl;
}
int main() {
int sum = 6;
int gcd = 2;
printTwoNumbers(sum, gcd);
}
実行結果
first number = 2 second number = 4
コードのポイント
__gcd(g, s - g)はGCCが提供するユーティリティ関数で、2つの整数の最大公約数を返します。C++17以降では標準ライブラリのstd::gcd(<numeric>ヘッダ)を使うこともできます。s != gのチェックは重要です。s == gの場合、s - g = 0となり、0は正の整数のペアとして不適切だからです(例:sum = 4、gcd = 4 の場合は-1を返します)。判定条件
__gcd(g, s - g) == gは、「s - gがgの倍数であること」を確認しています。これにより、2つの数のGCDが本当にgと一致することが保証されます。計算量はGCD計算の O(log(min(a, b))) のみと非常に効率的で、大きな数でも高速に動作します。
-
C++でGCDとLCMの値から条件を満たす数のペアの総数を求める方法
この記事では、最大公約数(GCD)と最小公倍数(LCM)の値が与えられたとき、その両方の条件を満たす整数のペアが全部で何通り存在するかを求める方法を解説します。 例として、GCDが2、LCMが12の場合を考えてみましょう。この条件を満たすペアは (2, 12)、(4, 6)、(6, 4)、(12, 2) の4つです。プログラムの目的は、このペアの総数「4」を計算することです。 解決の鍵となる数学的性質 2つの整数 a と b の間には、次のような重要な関係が常に成り立ちます。 a × b = GCD(a, b) × LCM(a, b) また、a と b はいずれも必ず GCD で割り切れるた
-
C++でn個の数のGCD(最大公約数)とLCM(最小公倍数)を求めるプログラム
本記事では、複数の整数からGCD(最大公約数)とLCM(最小公倍数)を求めるC++プログラムを解説します。GCD(Greatest Common Divisor:最大公約数)とは、2つ以上の整数(すべてがゼロではないもの)に共通する約数の中で最大となる正の整数のことです。英語では Greatest Common Factor(最大公因子)とも呼ばれます。一方、LCM(Least Common Multiple:最小公倍数)とは、2つの数のどちらの倍数にもなる数のうち、ゼロ以外で最小の数を指します。アルゴリズムまず、処理の流れを擬似コードで確認しましょう。GCDの計算には、剰余を繰り返し求める「