出典: 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 件のコメント:
コメントを投稿