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

C++で配列内のK番目の奇数を見つける方法

このチュートリアルでは、与えられた配列の中からK番目の奇数を見つけるプログラムをC++で作成します。配列の走査と条件分岐の基本的な考え方を学べる、初心者向けの良い例題です。

問題を解く手順

以下の手順に従って問題を解いていきましょう。

  • 配列と値kを初期化します。
  • 配列を先頭から順に走査します。
    • 現在の要素が奇数であれば、kの値を1減らします。
    • kが0になった時点で、その要素を結果として返します。
  • 配列全体を走査してもK番目の奇数が見つからない場合は、-1を返します。

サンプルコード

それでは、実際のコードを見てみましょう。

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

int findKthOddNumber(int arr[], int n, int k) {
    for (int i = 0; i < n; i++) {
        if (arr[i] % 2 == 1) {
            k--;
        }
        if (k == 0) {
            return arr[i];
        }
    }
    return -1;
}

int main() {
    int arr[] = { 4, 5, 22, 1, 55 };
    int k = 3;
    cout << findKthOddNumber(arr, 5, k) << endl;
    return 0;
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

55

コードの解説

この例では、配列 {4, 5, 22, 1, 55} の中から3番目の奇数を探しています。処理の流れは以下の通りです。

  • 最初の要素「4」は偶数なのでスキップされます。
  • 2番目の要素「5」は1番目の奇数なので、kは3から2になります。
  • 3番目の要素「22」は偶数なのでスキップされます。
  • 4番目の要素「1」は2番目の奇数なので、kは2から1になります。
  • 5番目の要素「55」は3番目の奇数なので、kが0になり、55が返されます。

なお、元のコードではループ条件が i <= n となっており、配列の範囲外にアクセスする可能性があるため、i < n に修正しています。これは未定義動作を防ぐために重要なポイントです。

まとめ

このように、配列を一度走査するだけでK番目の奇数を見つけることができます。計算量はO(n)となり、非常に効率的なアルゴリズムです。同様の手法は、K番目の偶数や特定の条件を満たす要素の検索にも応用できます。チュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。

  1. C++で算術数(約数の平均が整数になる数)を判定する方法

    算術数とは算術数(Arithmetic Number)とは、その数のすべての正の約数の平均(相加平均)が整数になる数のことです。つまり、ある数 n について「約数の総和 ÷ 約数の個数」が割り切れる場合、その n は算術数であると定義されます。具体例で確認してみましょう。入力 : n = 6 出力 : YES 説明 : 約数は 1, 2, 3, 6 約数の総和 = 1 + 2 + 3 + 6 = 12 約数の個数 = 4 約数の総和 ÷ 約数の個数 = 12 / 4 = 3(整数なので算術数)なお、素数 p の場合、約数は 1 と p の2つだけなので平均は (1 + p) / 2 となります

  2. C++のCHAR_BITとは?意味と使い方を解説

    CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ