Problem25

30分プログラム、その296。Problem25 via ProjectEuler

フィボナッチ数列は以下の漸化式で定義される:

F(n) = F(n-1) + F(n-2), ただし F(1) = 1, F(2) = 1.

最初の12項は以下である.

  • F(1) = 1
  • F(2) = 1
  • F(3) = 2
  • F(4) = 3
  • F(5) = 5
  • F(6) = 8
  • F(7) = 13
  • F(8) = 21
  • F(9) = 34
  • F(10) = 55
  • F(11) = 89
  • F(12) = 144

12番目の項, F12が3桁になる最初の項である.
1000桁になる最初の項の番号を答えよ.

最初はPerlでやろうとしたら10**1000程度の数値を扱えなかったので、Pythonに変更。Perlの数値型はdoubleの範囲しか扱えないらしいですよ。
それと再帰でフィボナッチ数を計算しようとしたら、再帰が深すぎると怒られたのでwhileに変更。末尾再帰にしたほうが格好よかったかもしれない。

使い方

$ time python problem25.py
4782
python problem25.py  1.35s user 0.12s system 89% cpu 1.648 total

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# problem25.pl -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/05/01 08:55:28
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

# def fib(n):
#    if n == 0 or n == 1:
#	return (1,1);
#    else:
#        (x,y) = fib(n - 1)
#        return (x+y,x)

i = 1
(current,prev) = (1,0)
while len(str(current)) < 1000:
    (current,prev) = (current+prev,current)
    i+=1

print i