2012年6月14日木曜日

プロジェクトオイラー Problem20

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

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


Problem 20
n × (n - 1) × ... × 3 × 2 × 1 を n! と表す。
100! の各桁の数字の合計を求めよ。


私の解答例は以下です。
-----

def f(i):
	if i<=1: return 1
	else: return i*f(i-1)
	
print sum([int(i) for i in str(f(100))])
-----

・f()
 階乗の関数を再帰呼び出しで書いてみました。
 停止条件がi=1であり、f(1)になるまで、引数iに1つ前の階乗値f(i-1)をかけます。
 1つ前の階乗値を求めるなかで、さらに1つ前の階乗値を使用するため自分自身を呼び出します。

・sum([int(i) for i in str(f(100))])
 階乗値f(100)をstr関数で文字型に変換します。
 文字型はpythonではシーケンス(sequence)という、forループで回せるオブジェクトです。
 文字列をforループで回すと、ループ変数に文字列の1文字ずつが設定されます。
 こうしてループ変数iに階乗値の1桁ずつが文字型で設定されてfor文の前に渡され、int関数で整数型にした状態で配列の要素として保持します。
 こうして、100の階乗値の1桁ずつの数値を設定した配列ができあがり、これをsum関数で合計します。

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

648

(追記)
・20120708
 関数fの停止条件がn==1では無限ループになるのでn<=1に修正。
・20120715
 ソースコード部分にSyntaxHighlighterを導入。

0 件のコメント:

コメントを投稿