2012年5月1日火曜日

プロジェクトオイラー Problem6

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

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

Problem 6
最初の10個の自然数について、その和の二乗と、二乗数の和は以下の通り。
  1² + 2² + ... + 10² = 385
  (1 + 2 + ... + 10)² = 3025
これらの数の差は 3025 - 385 = 2640 となる。
同様にして、最初の100個の自然数について和の二乗と二乗の和の差を求めよ。


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

#和の二乗
def p(n): return sum([i for i in xrange(1, n+1)])**2

#二乗の和
def q(n): return sum([i**2 for i in xrange(1, n+1)])

n=100
print p(n)-q(n), "( =", p(n), "-", q(n),")"
-----

1.和の二乗 p(n)
・[i for i in xrange(1, n+1)]

 「リストの内包表記」という表現方法です。
 xrange関数の部分は、1,2,・・・,n を順に返します。(イテレータオブジェクト)
 このイテレータから返される値が、for文の変数iとしてセットされ、
 forの前の変数iを要素として持つリストを表します。
 この部分の全体の意味は、[1,2,・・・,n]と同じです。
・sum(L)**2
 リストLの合計を取得し二乗します。
 これで上記とを合わせて (1 + 2 + ... + n)² を計算します。
 
2.二乗の和 q(n)
・[i**2 for i in xrange(1, n+1)]
 先ほどの説明とほぼ同じです。forの前を「i**2」とすることで、for文で取り出した変数iの二乗を要素として持つリストを表しています。

3.和の二乗と二乗の和の差
 print文の「p(n)-q(n)」が求める値です。

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


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

0 件のコメント:

コメントを投稿