C++でトリボナッチ数を生成する方法を解説
トリボナッチ数とは
トリボナッチ数(Tribonacci数)は、有名なフィボナッチ数とよく似た数列ですが、フィボナッチ数が直前の2項を足して次の項を求めるのに対し、トリボナッチ数は直前の3つの項を加算して新しい項を生成する点が異なります。
n番目の項 T(n) を求める漸化式は以下の通りです。
T(n) = T(n - 1) + T(n - 2) + T(n - 3)
数列の最初の3項は {0, 1, 1} から始まります。したがって、数列は「0, 1, 1, 2, 4, 7, 13, ...」と続いていきます。
アルゴリズム
トリボナッチ数を生成する基本的なアルゴリズムは以下のようになります。初期値3つを保持しながら、ループごとに値をずらして更新していくのがポイントです。
tribonacci(n):
Begin
first := 0, second := 1, third := 1
print first, second, third
for i in range n – 3, do
next := first + second + third
print next
first := second
second := third
third := next
done
EndC++での実装例
以下は、指定された個数分のトリボナッチ数を出力するC++プログラムの例です。
#include<iostream>
using namespace std;
long tribonacci_gen(int n){
// n個のトリボナッチ数を生成する関数
int first = 0, second = 1, third = 1;
cout << first << " " << second << " " << third << " ";
for(int i = 0; i < n - 3; i++){
int next = first + second + third;
cout << next << " ";
first = second;
second = third;
third = next;
}
}
main(){
tribonacci_gen(15);
}実行結果
このプログラムを実行すると、15個のトリボナッチ数が出力されます。
0 1 1 2 4 7 13 24 44 81 149 274 504 927 1705
処理の流れとポイント
- 変数
first、second、thirdの3つで直前の項を管理します。 - 各ループで
next = first + second + thirdを計算し、出力します。 - その後、3つの変数の値を1つずつ後ろにシフト(
first ← second ← third ← next)することで、常に直近3項を保持できます。
この手法により、再帰呼び出しを使わない反復的な実装となっているため、計算量は O(n) で効率的に動作します。なお、項の値は急激に大きくなるため、より多くの項を扱う場合は int ではなく long long 型を使用することをおすすめします。
-
【C++入門】エマープ数(Emirp)とは?n以下のエマープ数をすべて出力するプログラム
エマープ数(Emirp number)とは、素数の一種で、その桁を逆順に並べ替えると別の素数になる数のことです。ここでいう「別の素数」とは、元の数と同じ値にならないものを指します。 Emirpは「prime(素数)」を逆から読んだ言葉 すべての素数がエマープ数になるわけではありません。たとえば、回文素数(121のように逆から読んでも同じ数になる素数)や、1桁の素数(2、3、5、7)は、桁を逆にしても同じ数または意味を持たないため、エマープ数には含まれません。 エマープ数の例:13、17、37、733 などがあります。 13 を逆にすると 31(素数)→ エマープ数 17 を逆にすると 71
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ