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

C++でN番目の五角錐数を求める方法を解説

五角錐数とは

五角錐数(Pentagonal Pyramidal Number)とは、五角形を底面として積み上げたピラミッドに含まれる物体の総数を表す数です。まず、下図のようにいくつかの五角数を確認してみましょう。

C++でN番目の五角錐数を求める方法を解説

1からNまでの五角数の総和は、N番目の五角錐数と一致します。この記事では、N番目の五角錐数を求める方法について詳しく解説します。

入力:N = 4
出力:40
説明:最初の4つの五角数 1, 5, 12, 22 の合計は 40 です。

入力:N = 6
出力:126
説明:最初の6つの五角数 1, 5, 12, 22, 35, 51 の合計は 126 です。

解法へのアプローチ

シンプルなアプローチ

上記の例から、最も基本的なアプローチとして「1からNまで順番に走査し、各五角数を加算していく」という方法が思い浮かびます。i番目の五角数は次の式で求められます。

五角数 = (3 × n² − n) / 2

例えば n = 2 の場合、五角数 = (3 × 2² − 2) / 2 = 5 となります。

C++での実装例(シンプルなアプローチ)

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

int main () {
    int N = 6, SUM = 0;

    // 1からNまで走査する
    for (int i = 1; i <= N; i++) {
        // i番目の五角数を計算し、SUMに加算する
        SUM = SUM + (3 * i * i - i) / 2;
    }
    cout << "Nth Pentagonal Pyramidal Number: " << SUM << endl;
    return 0;
}

出力

Nth Pentagonal Pyramidal Number: 126

効率的なアプローチ

先ほどの方法ではループ処理が必要でしたが、N番目の五角錐数には次の公式が成り立つため、これを利用することでプログラムを大幅に効率化できます。

五角錐数 = n² × (n + 1) / 2

この公式を使えば、ループなしで時間計算量 O(1) で答えを求められます。

C++での実装例(効率的なアプローチ)

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

int main() {
    int N = 6, result;
    // 公式を使ってN番目の五角錐数を計算する
    result = N * N * (N + 1) / 2;
    cout << "Nth Pentagonal Pyramidal Number: " << result << endl;
    return 0;
}

出力

Nth Pentagonal Pyramidal Number: 126

まとめ

この記事では、N番目の五角錐数を求める問題について解説しました。「1からNまでの五角数を順に加算する方法」と「公式 n²(n+1)/2 を使う方法」の2つのアプローチを紹介し、それぞれのC++プログラムを実装しました。特に大きなNを扱う場合は、公式を使った方法が圧倒的に効率的です。なお、今回紹介したロジックはC、Java、Pythonなど他のプログラミング言語でも同様に実装できますので、ぜひ試してみてください。

  1. C++で列車の停車駅の組み合わせ数を求める方法

    地点XとYの間にはn個の中間駅があるとします。ここで、「どの2つの停車駅も隣り合わない」という条件のもとで、s個の駅に停車する列車の配置方法が何通りあるかを求める問題を考えてみましょう。この記事では、停車駅の組み合わせ数を求めるためのアプローチを段階的に詳しく解説します。この問題は、本質的には組合せ論の問題であり、s個の停車駅の選び方の総数を求めることになります。 問題を解くアプローチ まず具体例として、中間駅が8個あり、そのうち3個の駅に停車させたい場合を考えてみます。 n = 8, s = 3 このとき、列車が停車できない駅は(n − s)、つまり5個残ることになります。 停車できない

  2. C++で集合の反射関係の数を求める方法

    この記事では、C++を使って集合上に定義できる反射関係(reflexive relation)の総数を求める方法について解説します。問題設定としては、整数 n が与えられたとき、n 個の自然数からなる集合上に存在する反射関係の個数を求めるというものです。 反射関係とは 集合 A 上の関係 R が反射的であるとは、「A に属するすべての要素 a に対して、順序対 (a, a) が必ず R に含まれる」という条件を満たすことを意味します。数式で表すと次のようになります。 (a, a) ∈ R (∀ a ∈ A) 具体的な入出力の例を見てみましょう。 入力 : x = 1 出力 : 1 説明 : 集