C++でN番目のフィボナッチ数の下2桁を求めるプログラム
この記事では、数値Nが与えられたときに、N番目のフィボナッチ数の下2桁(最下位2桁)を求めるC++プログラムを紹介します。
問題の概要
N番目のフィボナッチ数について、その下2桁を求めるのが課題です。具体的な例を見てみましょう。
入力:N = 120
出力:81
解法のアプローチ
最も単純な方法は、フィボナッチ数の一般式(ビネの公式)を使ってN番目の項を直接計算することです。しかし、Nが非常に大きい数になると、この方法はオーバーフローや精度の問題で現実的ではありません。
そこで役立つのが、フィボナッチ数列の重要な性質です。フィボナッチ数の下2桁は300項ごとに同じ並びが繰り返されるというものです。これは「ピザーノ周期」と呼ばれる性質の一つで、例えば第75項の下2桁と第975項の下2桁は一致します。
つまり、最初の300項まで計算すればすべてのパターンが網羅できるため、Nを300で割った余りに対応する項を計算すればよいことになります。これにより、Nがどれほど巨大でも高速に答えを求められます。
サンプルコード
#include <iostream>
using namespace std;
long int fibo(int N){
long int a=0,b=1,c;
for(int i=2; i<= N;i++) {
c=a+b; a=b; b=c;
}
return c;
}
int findLastTwoDigitNterm(int N) {
N = N % 300;
return ( fibo(N)%100);
}
int main() {
int N = 683;
cout<<"The last two digits of "<<N<<"th Fibonacci term are "<<findLastTwoDigitNterm(N);
return 0;
}
実行結果
The last two digits of 683th Fibonacci term are 97
コードの解説
関数findLastTwoDigitNtermでは、まずNを300で割った余りに置き換えることで、計算すべき項を300以下に抑えています。その後、関数fiboで反復計算によりフィボナッチ数を求め、100で割った余りを取ることで下2桁だけを取り出しています。
なお、Nが1以下の場合はループが一度も実行されず未初期化の値を返す可能性があるため、実用的にはfibo関数内でN≤1の場合にNをそのまま返すガード処理を追加するとより安全です。
まとめ
フィボナッチ数列の下2桁が300項で一巡する性質を利用すれば、Nがどんなに大きくても最大300回程度の反復計算で答えを得られます。このような周期性の活用は、競技プログラミングなどで大きな数の特定の桁を扱う際によく使われるテクニックなので、ぜひ覚えておきましょう。
-
C++でN階乗の合計の下2桁を求める方法
本記事では、1!からN!までの階乗の合計について、その下2桁(一の位と十の位)を求める方法を解説します。例えば N = 4 の場合、1! + 2! + 3! + 4! = 33 となるため、一の位は「3」、十の位は「3」であり、結果は「33」となります。この問題には重要な性質があります。N が 5 より大きい場合、その階乗の一の位は必ず 0 になるため、6! 以降の項は一の位に一切影響を与えません。同様に、N が 10 以上になると十の位も 0 のまま変化しなくなります。したがって、N = 10 以上では結果は常に「13」で固定されます。実際に N = 1 から 10 までの階乗の値を表に整理
-
PythonでN番目のフィボナッチ数を求めるプログラム
数値 n が与えられたとき、n番目のフィボナッチ数を求めるプログラムをPythonで作成してみましょう。フィボナッチ数列とは、i番目の項が f(i) = f(i-1) + f(i-2) という漸化式で定義される数列です。最初の2項は 0 と 1 であり、それ以降の各項は直前の2つの項の和になります。数列を並べると「0, 1, 1, 2, 3, 5, 8, 13, 21, ...」のように続いていきます。例えば、入力が 15 の場合、15番目のフィボナッチ数である 610 が出力されます。解き方の手順この問題は反復処理(ループ)を使うことで効率的に解けます。手順は以下の通りです。変数 first