C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】奇数をすべて削除した範囲[1, n]におけるk番目に小さい数の求め方

問題の概要

この問題では、2つの整数 n と k が与えられます。求めるのは、範囲 [1, n] からすべての奇数を削除した状態で、k番目に小さい数を見つけることです。

つまり、偶数のみが残った範囲 [1, n] の中で、k番目に小さい値を特定する必要があります。

例えば、範囲 [1, 5] の場合、残る数は「2」と「4」になります。

具体例で理解しよう

  • 入力: n = 12, k = 4
  • 出力: 8

解説:

範囲 [1, n] に含まれる偶数は「2, 4, 6, 8, 10, 12」の6個です。この中で4番目に小さい要素は 8 となります。

解法のアプローチ

この解法は非常にシンプルです。n までの偶数の中から k 番目の要素を取り出すだけでよいため、次の式で簡単に計算できます。

k番目の要素 = 2 × k

ただし、この値が有効であるためには「2 × k ≤ n」を満たす必要があります。条件を満たさない場合、k番目に小さい偶数は範囲 [1, n] 内に存在しないことになります。

解法を実装したC++プログラム

#include <bits/stdc++.h>
using namespace std;

int main() {

    int n = 124, k = 12;
    if(n >= 2 * k){
        cout<<"k番目に小さい数は "<<(2 * k);  
    }
    else
        cout<<"k番目に小さい数は見つかりません";
    return 0;
}

実行結果

k番目に小さい数は 24

まとめ

n = 124、k = 12 の場合は「2 × 12 = 24」となり、24 は範囲 [1, 124] 内に存在するため、答えは 24 です。この手法の計算量は O(1) と非常に効率的で、n がどれほど大きくても即座に答えを求めることができます。

  1. C++で最小の約数がKとなる範囲内の数値を数える方法

    本チュートリアルでは、指定された範囲内にある数値のうち、「最小の約数(最小の素因数)」が K と一致するものの個数を求めるC++プログラムについて解説します。 問題の概要 範囲 [a, b] と整数 K が与えられたとき、この範囲に含まれる数値の中で「最小の約数が K であるもの」を数えるのが目的です。 ある数 n の最小の約数が K になるためには、次の2つの条件を満たす必要があります。 n が K で割り切れること 2 以上 K 未満のいずれの整数でも n が割り切れないこと また重要な点として、K が素数でない場合、条件を満たす数は存在しません(合成数が「最小の約数」となることはな

  2. C++で正確にk個の奇数を含む最長部分配列を求める方法

    問題の概要n個の要素からなる配列が与えられたとき、正確にk個の奇数を含む最長の部分配列(サブ配列)の長さを求めるのがこの問題です。例として、A = [2, 3, 4, 11, 4, 12, 7]、k = 1 の場合を考えてみましょう。このとき答えは 4 となり、該当する部分配列は [4, 11, 4, 12] です(含まれる奇数は 11 の1個だけです)。アルゴリズム:スライディングウィンドウこの問題はスライディングウィンドウ(尺取り法)を使うことで効率的に解けます。全体の計算量は O(n) に抑えられます。手順は以下の通りです。max := 0、count := 0、start := 0 と