【C++】Cで割り切れ、範囲[A, B]に含まれない最小の正の整数を求める方法
問題の概要
今回は興味深いプログラミング問題を取り上げます。3つの整数 A、B、C が与えられたとき、「X mod C = 0」を満たし、かつ X が範囲 [A, B] に含まれない最小の正の整数 X を求めることを考えます。
例えば、A = 5、B = 10、C = 4 の場合、答えとなる X の値は 4 です。これは、4 が C で割り切れ(4 ÷ 4 = 1)、かつ範囲 [5, 10] の外側に存在するためです。
解法のアプローチ
この問題は、以下のシンプルな手順で解くことができます。
- C が範囲 [A, B] に含まれない場合: C をそのまま結果として返します。C 自身が「C で割り切れ、範囲外にある」条件を満たす最小の値だからです。
- C が範囲 [A, B] に含まれる場合: B より大きい最初の C の倍数を求めて返します。具体的には、(B / C) × C + C という式で計算できます。
C++での実装例
#include <iostream>
using namespace std;
int findMinNumber(int a, int b, int c) {
// Cが範囲[A, B]の外にある場合はCをそのまま返す
if (c < a || c > b)
return c;
// Bより大きい最初のCの倍数を求める
int res = ((b / c) * c) + c;
return res;
}
int main() {
int a = 2, b = 4, c = 2;
cout << "Minimum number X: " << findMinNumber(a, b, c);
}実行結果
Minimum number X: 6
この例では、A = 2、B = 4、C = 2 となっています。C = 2 は範囲 [2, 4] に含まれるため、B = 4 より大きい最初の 2 の倍数である 6 が出力されます。
計算量について
このアルゴリズムの時間計算量は O(1) です。比較と算術演算のみで構成されており、ループを使用しないため、入力のサイズに関わらず一定の速度で処理が完了します。空間計算量も O(1) であり、非常に効率的な解法といえます。
-
C++で配列を均等に分割するために挿入すべき最小の正の整数を求める方法
問題概要 N個の正の整数からなる配列が与えられます。この配列内の任意の2つの要素の間に、ある正の整数を挿入したとき、左側の部分配列の合計と右側の部分配列の合計が等しくなるようにしたいと考えます。新しく挿入した整数は、左右どちらか一方の部分配列に含まれるものとします。本記事では、この条件を満たすために挿入すべき正の整数のうち、最小の値を求める方法を解説します。 具体例 たとえば、配列が {3, 2, 1, 5, 7, 10} の場合、答えは 6 になります。値 6 を 5 と 7 の間に挿入すると、左右の部分配列の合計は次のように一致します。 3 + 2 + 1 + 5 + 6 = 177 +
-
C++でCの倍数かつ範囲[A, B]に含まれない最小の正の整数を求める方法
問題の概要3つの整数 A、B、C が与えられたとき、次の条件を両方満たす最小の整数 X を求めます。X は C で割り切れる(X mod C = 0)X は範囲 [A, B] に含まれない例として、A = 5、B = 10、C = 4 の場合を考えてみましょう。このとき答えは X = 4 となります。4 は 4 で割り切れ、かつ範囲 [5, 10] の外側にあるためです。解法のアプローチこの問題は定数時間 O(1) で解くことができます。考え方の手順は以下の通りです。ステップ1: C が範囲 [A, B] に含まれていない場合(C < A または C > B)、C 自身が条件を満た