2012年7月10日火曜日

プロジェクトオイラー Problem25

「プロジェクト オイラー」の問題をpythonでやってみます。

出典: Project Euler (日本語翻訳サイト)
参考:
サイエンスもの置き場 プロジェクトオイラーを遊び倒すガイド(初級編)

Problem 25
フィボナッチ数列は以下の漸化式で定義される:
Fn = Fn-1 + Fn-2, ただし F1 = 1, F2 = 1.
最初の12項は以下である.

  • F1 = 1
  • F2 = 1
  • F3 = 2
  • F4 = 3
  • F5 = 5
  • F6 = 8
  • F7 = 13
  • F8 = 21
  • F9 = 34
  • F10 = 55
  • F11 = 89
  • F12 = 144
12番目の項, F12が3桁になる最初の項である.
1000桁になる最初の項の番号を答えよ.



私の解答例は以下です。
-----
def f(n):
	if n<1: return False
	i, a, b = 1, 1, 0
	while len(str(a))<n: i, a, b = i+1, a+b, a
	return i
	
print f(1000)
-----
1.関数f(n)
・n桁になる最初のフィボナッチ数の項の番号を返します。
・if n<1: return False
 定義から、最初に1桁になるのは項の番号=1なので、1未満はFalseを返します。
・i, a, b = 1, 1, 0
 iは項の番号、aはFn-1、bはFn-2 です。
 3つの変数を一度に初期化します。

 項の番号=1のとき、1つ前のF0=1、2つ前は0です。
・while len(str(a))<n:
 フィボナッチ数aを文字型にして文字列数を求め、指定桁n未満ならば処理を続けます。
・ i, a, b = i+1, a+b, a
 フィボナッチ数を1つ進めます。
 項番号iは+1、a(=Fn-1)はa+b、b(=Fn-2)はa(=Fn-1)にします。


2.関数の外
・上記の関数fに、指定桁1000を渡せば求める値になります。



解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。
4782

(追記)
・20120715
 ソースコード部分にSyntaxHighlighterを導入。

0 件のコメント:

コメントを投稿