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