指定された条件を満たす2つの整数を求めるC++プログラムの解説
数値 x が与えられたとき、以下の条件をすべて満たす2つの整数 a と b を見つける問題を考えてみましょう。
- a と b はどちらも 1 以上 x 以下の範囲内にある
- a は b で割り切れる(a % b == 0)
- a × b > x が成り立つ
- a ÷ b < x が成り立つ
条件を満たす組み合わせが存在しない場合は -1 を返します。例えば x = 10 の場合、出力は 6 と 3 になります(他の組み合わせも正解となり得ます)。
シンプルな解法のポイント
この問題は実は非常にシンプルな解法があります。それは a = x、b = x とすることです。この選択が条件を満たすことを確認してみましょう。
- a は b で割り切れる:x ÷ x = 1 となるため成立
- a × b = x² は、x > 1 のとき必ず x より大きくなるため成立
- a ÷ b = 1 は、x > 1 のとき必ず x より小さくなるため成立
したがって、x ≥ 2 であれば常に a = b = x が正解となります。一方、x < 2(つまり x = 1)の場合は、a ÷ b = 1 となり「a ÷ b < x」の条件を満たせないため、-1 を出力します。
解法のアルゴリズム
- x < 2 の場合は -1 を出力して終了する
- それ以外の場合は x と x を出力する
C++での実装例
以下に実際の実装を示します。
#include <bits/stdc++.h>
using namespace std;
void solve(int x){
if (x < 2){
cout << -1;
return;
}
cout << x << ", " << x;
}
int main(){
int x = 10;
solve(x);
}
入力例
10
出力例
10,10
まとめ
この問題は一見複雑な条件に思えますが、a と b をどちらも x にすることで、x ≥ 2 のすべてのケースで条件を満たせるという巧妙な性質を利用しています。計算量は O(1) であり、非常に効率的な解法です。
-
【C++】バックトラッキングでグリッドの8つのマスに1〜8の数字を条件付きで配置する方法
この記事では、図の中にある8つの丸(マス)に「1」から「8」までの数字を、「数列上で隣り合う数字同士がグリッド上でも隣接しない」という条件を満たすように配置する問題を、C++で解く方法を解説します。問題の概要たとえば、入力として次のような3×4のグリッドが与えられたとします。「0」は使用しないマス、「-1」はまだ数字が置かれていない空きマスを表します。0-1-10-1-1-1-10-1-10この場合の出力は次のようになります。 3 5 7 1 8 2 4 6この結果では、たとえば「1」と「2」、「7」と「8」のように数列で連続する数字が、グリッド上で上下左右・斜めに隣り合わないように配置
-
C++で指定範囲内のすべての「良い数」を出力する方法
この問題では、3つの整数 L・R・d が与えられます。目的は、L から R までの範囲内に存在する「良い数」のうち、いずれの桁にも d が含まれていない数をすべて出力することです。 良い数(Good Number)とは? 良い数とは、すべての桁において、その桁の数字が「自分より右側(下位)の桁の数字の合計」より大きくなっている数のことです。例えば 732 は良い数です。7 > 3+2 であり、3 > 2 という条件がどちらも満たされているからです。 問題例 入力:L = 400 , R = 500 , d = 3 出力:410, 420, 421 説明:400〜500 の範囲に