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

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

問題概要

この問題では、整数 N が与えられます。求めるのは、数列 0, 2, 4, 8, 12, 18 … のN番目の項です。数列のパターンを観察して一般項(公式)を導き出し、それを計算するC++プログラムを作成しましょう。

入出力の例

まず、具体例を使って問題を確認します。

入力

N = 5

出力

12

N = 5 のとき、数列の5番目の項は 12 となります。

解法アプローチ

最も効率的な解法は、数列のN番目の項を表す一般項(公式)を導出することです。そのためには、まず数列を注意深く観察し、パターンを一般化する必要があります。

数列の観察

隣り合う項同士の差に注目すると、次のような規則性が見えてきます。

  • 2 − 0 = 2
  • 4 − 2 = 2
  • 8 − 4 = 4
  • 12 − 8 = 4
  • 18 − 12 = 6

差は「2, 2, 4, 4, 6, 6 …」と、2項ごとに2ずつ増加する綺麗なパターンになっています。

一般項の公式

この観察から、N番目の項は次の公式で求められます。

T(N) = ( N + (N − 1) × N ) / 2

この式は N + N × (N − 1) = N² と整理できるため、実質的には T(N) = ⌊N² / 2⌋(N² を2で割った値の切り捨て)と同じ意味になります。

検証: N = 5 の場合、T(5) = (5 + 4 × 5) / 2 = 25 / 2 = 12(整数除算)となり、実際の出力と一致します。

この方法の大きな利点は、ループや再帰が一切不要なことです。計算量は O(1) であり、Nがどれほど大きくても即座に答えを求められます。

C++での実装例

上記の解法を実装したプログラムがこちらです。

#include <iostream>
using namespace std;

int calcNthTerm(int N) {
    return (N + N * (N - 1)) / 2;
}

int main() {
    int N = 10;
    cout << N << "th term of the series is " << calcNthTerm(N);
    return 0;
}

出力

10th term of the series is 50

N = 10 のとき、T(10) = (10 + 9 × 10) / 2 = 100 / 2 = 50 となり、正しく計算できていることがわかります。

まとめ

数列 0, 2, 4, 8, 12, 18 … のN番目の項は、公式 T(N) = (N + (N−1) × N) / 2 を使えば O(1) で求められます。「隣接する項の差を観察してパターンを一般化する」というアプローチは、競技プログラミングにおいて非常に重要なスキルなので、ぜひマスターしておきましょう。

  1. C++で数列 3, 5, 21, 51, 95, … のN番目の項を求めるプログラム

    この記事では、数値Nが与えられたときに、C++を使って数列 3, 5, 21, 51, 95, … のN番目の項を求めるプログラムの作成方法を解説します。 問題の説明 次の数列のN番目の項を求めるのが課題です。 3, 5, 21, 51, 95, 153, …(N項まで) この数列は各項の増加パターンから、二次方程式(二次関数)に従うことがわかります。したがって、まず数列の一般項の公式を導き出す必要があります。 入出力例 入力: N = 6 出力: 153 解決アプローチ この問題を解くには、数列の一般項(第n項)の公式を求めます。この数列の一般項は、以下の二次式で表されます。 Tn = 7

  2. C++で指定された数列のN番目の項を求めるプログラム

    この問題では、数値 N が与えられ、指定された数列のN番目の項を求めるプログラムをC++で作成します。 問題の説明 次の数列のN番目の項を求めます。 1, 1, 2, 3, 4, 9, 8, 27, 16, 81, 32, 243, 64, 729, 128, 2187, 256, ... (N項まで) まずは、この数列の一般項(規則性)を見つけるところから始めます。 具体例で問題を確認してみましょう。 例1 入力: N = 6 出力: 9 例2 入力: N = 13 出力: 64 解法のアプローチ この問題を解くには、まず数列を注意深く観察する必要があります。この数列は複数の規則が混ざった「