1つが他方の倍数である数のペアを見つけるC++コード
問題概要
2つの整数 l と r が与えられます。このとき、次の条件をすべて満たすペア (x, y) を見つけることが課題です。
l <= x, y <= r:x と y はどちらも範囲 [l, r] 内に収まることx != y:x と y は互いに異なる数であること- x が y を割り切ること(x が y の約数、つまり y が x の倍数)
条件を満たす答えが複数存在する場合は、その中からどれを返しても構いません。
たとえば、入力が l = 3、r = 14 の場合、出力は (3, 6) となります。もちろん (3, 9) も有効な答えのひとつです。
解法のアプローチ
この問題の解法は非常にシンプルで、以下のステップを実行するだけです。
lとl * 2をそのまま出力する
return l and l*2
なぜこの方法で正しいのか
l は定義上、必ず範囲内に含まれています。また、2 * l は l の倍数であるため、「x が y を割り切る」という条件を自動的に満たします。さらに l と 2 * l は(l が 0 でない限り)必ず異なる数なので、「x ≠ y」という条件もクリアできます。
補足として、この手法が有効なのは 2 * l <= r を満たす場合です。2 * l > r のときは、範囲内に l 以外の l の倍数が存在しないため、条件を満たすペア自体が存在しません。
実装例(C++)
理解を深めるために、実際のコード実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void solve(int l, int r){
cout << l << ", " << l * 2;
}
int main(){
int l = 3;
int r = 14;
solve(l, r);
}
入力
3, 14
出力
3, 6
-
C++で1からnまでの素数の積を求める方法
数値 n が与えられたとき、1 から n までの範囲に含まれる素数をすべて掛け合わせた積を求めることを考えます。例えば n = 7 の場合、素数は 2・3・5・7 なので、出力は 2 × 3 × 5 × 7 = 210 となります。アプローチ:エラトステネスの篩この問題を効率的に解くには、エラトステネスの篩(ふるい)と呼ばれる古典的なアルゴリズムを使います。この手法では、2 から始めて各素数の倍数を順に除外していくことで、1 から n までのすべての素数を高速に見つけることができます。その後、見つかった素数をすべて掛け合わせれば答えが得られます。アルゴリズムの手順サイズ n+1 の真偽値配列を
-
【C++】n個の数値からなる集合Sの中で、中央値に最も近いk個の数を見つける方法
本記事では、n個の数値からなる集合Sが与えられたとき、その中央値(メジアン)に最も近いk個の数を求めるC++プログラムを紹介します。この問題は、まずクイックソートでデータを並べ替え、その後中央値を基準として左右にポインタを広げながら近い順に要素を選んでいくというアプローチで解くことができます。アルゴリズムの概要処理は大きく分けて「パーティション(分割)」「クイックソート」「中央値からの探索」の3段階で構成されます。1. partition関数:配列の分割配列a[]の末尾の値(high)をピボットとして扱い、それより小さい要素を左側に集めることで配列を分割します。Begin functi