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

C++でテトラナッチ数列を生成する方法

この記事では、C++を使ってテトラナッチ(Tetranacci)数を生成する方法を解説します。テトラナッチ数はフィボナッチ数によく似た数列ですが、フィボナッチ数が直前の2つの項の和で次の項を求めるのに対し、テトラナッチ数では直前の4つの項をすべて足し合わせて新しい項を生成する点が特徴です。

n番目の項 T(n) を求める漸化式は以下の通りです。

T(n) = T(n - 1) + T(n - 2) + T(n - 3) + T(n - 4)

数列の出発点となる最初の4つの初期値は {0, 1, 1, 2} です。これ以降の項は、直前の4項の和として順次決まっていきます。

アルゴリズム

テトラナッチ数列を効率よく生成するには、常に直近の4つの値だけを保持しながら、変数をスライドさせていく手法が有効です。

tetranacci(n):
Begin
    first := 0, second := 1, third := 1, fourth := 2
    print first, second, third, fourth
    for i in range n − 4, do
        next := first + second + third + fourth
        print next
        first := second
        second := third
        third := fourth
        fourth := next
    done
End

まず初期値の4つを出力し、その後ループ内で「next」に直前4項の合計を代入しては出力します。そして各変数を1つずつ前にずらすことで、配列を使わずに済みます。この方法なら時間計算量は O(n)、必要な記憶領域は O(1) で非常に効率的です。

C++での実装例

#include<iostream>
using namespace std;
long tetranacci_gen(int n){
    //n個のテトラナッチ数を生成する関数
    int first = 0, second = 1, third = 1, fourth = 2;
    cout << first << " " << second << " " << third << " " << fourth << " ";
    for(int i = 0; i < n - 4; i++){
        int next = first + second + third + fourth;
        cout << next << " ";
        first = second;
        second = third;
        third = fourth;
        fourth = next;
    }
}
main(){
    tetranacci_gen(15);
}

実行結果

0 1 1 2 4 8 15 29 56 108 208 401 773 1490 2872

コードの解説

関数 tetranacci_gen() は、引数 n で指定された個数のテトラナッチ数を標準出力に表示します。

  • 初期化: 変数 firstfourth に初期値 0, 1, 1, 2 を設定し、そのまま出力します。
  • ループ処理: 残りの n−4 項について、next に直前4項の合計を格納して出力します。
  • 変数の更新: firstfourth を順にシフトさせ、常に最新の4項のみをメモリ上に保持します。

なお、テトラナッチ数は増加が非常に速いため、大きな n を扱う場合はオーバーフローに注意してください。int の代わりに long long や多倍長整数型を使用すると、より大きな項まで正確に計算できます。

  1. 【C++入門】エマープ数(Emirp)とは?n以下のエマープ数をすべて出力するプログラム

    エマープ数(Emirp number)とは、素数の一種で、その桁を逆順に並べ替えると別の素数になる数のことです。ここでいう「別の素数」とは、元の数と同じ値にならないものを指します。 Emirpは「prime(素数)」を逆から読んだ言葉 すべての素数がエマープ数になるわけではありません。たとえば、回文素数(121のように逆から読んでも同じ数になる素数)や、1桁の素数(2、3、5、7)は、桁を逆にしても同じ数または意味を持たないため、エマープ数には含まれません。 エマープ数の例:13、17、37、733 などがあります。 13 を逆にすると 31(素数)→ エマープ数 17 を逆にすると 71

  2. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ