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

C++で数列0, 0, 2, 1, 4, 2, 6, 3, 8…のN番目の項を求めるプログラム

この記事では、数値Nが与えられたとき、C++を用いて数列「0, 0, 2, 1, 4, 2, 6, 3, 8…」のN番目の項を求めるプログラムの作成方法を解説します。

問題の概要

与えられた数列のN番目の項を求めることが目標です。

0, 0, 2, 1, 4, 2, 6, 3, 8 ....(N項まで)

ポイントは、この数列の一般項を導き出すことです。

具体例で問題を確認してみましょう。

入力

N = 8

出力

3

解法のアプローチ

数列の一般項を求めるには、数列を注意深く観察する必要があります。この数列は一見すると規則性が分かりにくいのですが、実は2つの数列が交互に並んだものです。1つは奇数番目の位置に現れる数列、もう1つは偶数番目の位置に現れる数列です。

奇数番目の数列: 0, 2, 4, 6, 8, 10, 12, ...(2ずつ増加)

偶数番目の数列: 0, 1, 2, 3, 4, 5, 6, ...(1ずつ増加)

このことから、数列のn番目の項の値は次のように表せます。

  • nが奇数の場合: 値は (n-1)
  • nが偶数の場合: 値は T(n-1) / 2(直前の項を2で割った値)

C++での実装例

#include <iostream>
using namespace std;

int findNTerm(int N) {
    if (N % 2 == 0)
        return findNTerm(N - 1) / 2;
    else {
        return (N - 1);
    }
}

int main() {
    int N = 13;
    cout << N << "番目の項の値は " << findNTerm(N) << endl;
    return 0;
}

出力

13番目の項の値は 12

コードの解説

関数findNTermは再帰的に定義されています。Nが偶数の場合は、直前の項findNTerm(N-1)の値を2で割った値を返し、Nが奇数の場合はそのまま(N-1)を返します。数列の規則性がそのままコードに反映されたシンプルな実装です。

なお、偶数番目の項は T(N-1)/2 = (N-2)/2 と変形できるため、再帰を使わずに次のように書くこともできます。

int findNTerm(int N) {
    if (N % 2 == 0)
        return (N - 2) / 2;
    else
        return (N - 1);
}

この方法であれば再帰呼び出しのオーバーヘッドがなく、O(1)の計算量でN番目の項を求めることができます。

  1. C++で数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラム

    この問題では、数値 N が与えられ、C++を用いて数列 1, 2, 11, 12, 21… のN番目の項を求めるプログラムを作成します。 問題の概要 次の数列のN番目の項を求めます。 1, 2, 11, 12, 21, 22, 111, 112, …(第N項まで) この数列には一定のパターンが隠されており、それをもとに一般項を導き出す必要があります。 具体例を見てみましょう。 入力 N = 8 出力 112 解法のアプローチ 一般項を導くためには、まず数列を注意深く観察することが重要です。この数列には次のような特徴があります。 すべての項が「1」と「2」のみで構成されている。 各項の末尾の

  2. C++で数列3、5、33、35、53…のN番目の項を求めるプログラム

    はじめにこのチュートリアルでは、数列「3、5、33、35、53…」のN番目の項を求めるC++プログラムについて解説します。この問題では、ある整数nが与えられます。私たちのタスクは、その数列におけるn番目の項を特定することです。数列の規則性まず、この数列がどのように構成されているのかを見てみましょう。1番目の項:32番目の項:53番目の項:33(1番目の項に「3」を付加)4番目の項:35(1番目の項に「5」を付加)5番目の項:53(2番目の項に「3」を付加)6番目の項:55(2番目の項に「5」を付加)つまり、奇数番目の項は「i/2 番目の項の末尾に3を付けた数」、偶数番目の項は「(i/2 − 1