2012年5月20日日曜日

プロジェクトオイラー Problem16

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

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

Problem 16
215 = 32768 であり、これの各数字の合計は 3 + 2 + 7 + 6 + 8 = 26 となる。
同様にして、21000 の各数字の合計を求めよ。


私の解答例は以下です。
-----
def f(n): return sum([int(i) for i in str(2**n)])
print f(1000)
-----

1.関数f(n)
2のn乗の各桁の和を返します。

・2**n
 「**」演算子は累乗です。ここでは2のn乗のことです。
 107・・・376という302桁に数字になります。
pythonでは値の桁数制限がないのでこの表記で2の1000乗でも大丈夫です。
・str関数で文字列化します。
 ”107・・・376”という302文字の文字列です。
・次にlist関数で各桁1文字ずつのリストにします。
["1", "0", "7",・・・, "3", "7", "6”]というリストになります。
・[]を用いて、内装表示で、各桁1ずつのリストから要素1つずつを取り出して、int関数で数値に変換したリストになります。
[1, 0, 7,・・・, 3, 7, 6]というリストになります。
・sum関数で上記リストの和を求めます。


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

(追記)
・20120715

 list(str(2**n)) -> str(2**n) に修正。
 stringオブジェクトはlistオブジェクトと同じシーケンス(sequence)という種類のオブジェクトで、ループで回すことができるため。
 
・20120715
 ソースコード部分にSyntaxHighlighterを導入。

0 件のコメント:

コメントを投稿