2012年8月18日土曜日

Project Euler - Probrem 40

Project Euler(プロジェクト オイラー)の問題をpythonでやってみます。

出典: Project Euler(日本語 翻訳サイト)
    ProjectEuler.net(英語サイト)

Problem 40

正の整数を順に連結して得られる以下の10進の無理数を考える:
0.123456789101112131415161718192021...
小数第12位は1である.

dnで小数第n位の数を表す.
d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000を求めよ.


-----

私の解答例は以下です。畳んでいます。

def f(n):
	m, s = 0, "."
	while len(s)<=n:
		m += 1
		s += str(m)
	return int(s[n])

s = 1
for i in xrange(7): s *= f(10**i)
print s


1.関数f(n)
・正の整数を順に連結して得られる文字列のn桁目の値を返します。


・m, s = 0, "."
 mは連結する数、sは連結した文字列です。
 初期値はそれぞれ0と小数点とします。


・while len(s)<=n:
  m += 1
  s += str(m)
 mは連結する数字です。1ずつカウントアップします。
 sは上記mを文字型に変換して右へ連結していきます。
 連結した文字列sの長さがnを超えたら終了です。


・return int(s[n])
 連結した文字列sのn番目の値だけを数値型にして返します。


2.関数の外
・s = 1
 for i in xrange(7): s *= f(10**i)
 print s
 問題に合う値を指定して、関数f(n)で戻り値を取得し掛け算で累積します。
 **演算子は累乗です。



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

0 件のコメント:

コメントを投稿