C++で指定された3つの条件を満たす数aとbを見つける方法
整数 n が与えられたとき、以下の3つの条件をすべて満たす2つの数 a と b を見つけることを考えます。
- a mod b = 0(aがbで割り切れる)
- a * b > n(積がnより大きい)
- a / b < n(商がnより小さい)
条件を満たすペアが存在しない場合は、-1を出力します。
例として、n = 10 の場合、a = 90、b = 10 とすると、上記の3つの条件をすべて満たします。
解法のアプローチ
この問題は、次の手順で効率的に解くことができます。
- b = n と固定します。すると、a は残りの条件から導き出せます。
- a mod b = 0 となるのは、a が b の倍数のときです。
- a / b < n を満たすためには、a / b = n - 1(n - 1 は n より小さい)とすればよいことがわかります。
- したがって a = b × (n - 1) とすると、a * b > n も自動的に満たされます。
つまり、a = n × (n - 1)、b = n とすれば、3つの条件をすべて満たす解が得られます。
サンプルコード
#include<iostream>
using namespace std;
void findAandB(int n) {
int b = n;
int a = b * (n - 1);
if (a * b > n && a / b < n) {
cout << "a: " << a << endl;
cout << "b: " << b;
} else
cout << -1 << endl;
}
int main() {
int n = 10;
findAandB(n);
}実行結果
a: 90 b: 10
計算量について
この解法は、b を n に固定し、a を数式から直接求めるため、ループによる探索が不要です。そのため時間計算量は O(1) となり、非常に効率的です。n が大きくなっても即座に答えを計算できる点が大きなメリットです。
-
【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」となります。
-
C++でn個の数のGCD(最大公約数)とLCM(最小公倍数)を求めるプログラム
本記事では、複数の整数からGCD(最大公約数)とLCM(最小公倍数)を求めるC++プログラムを解説します。GCD(Greatest Common Divisor:最大公約数)とは、2つ以上の整数(すべてがゼロではないもの)に共通する約数の中で最大となる正の整数のことです。英語では Greatest Common Factor(最大公因子)とも呼ばれます。一方、LCM(Least Common Multiple:最小公倍数)とは、2つの数のどちらの倍数にもなる数のうち、ゼロ以外で最小の数を指します。アルゴリズムまず、処理の流れを擬似コードで確認しましょう。GCDの計算には、剰余を繰り返し求める「