出典: Project Euler(日本語 翻訳サイト)
ProjectEuler.net(英語サイト)
Problem 43
数1406357289は0から9のPandigital数である (0から9が1度ずつ現れるので).
この数は部分語が面白い性質を持っている.
d1を1桁目, d2を2桁目の数とし, 以下順にdnを定義する.
この記法を用いると次のことが分かる.
- d2d3d4=406は2で割り切れる
- d3d4d5=063は3で割り切れる
- d4d5d6=635は5で割り切れる
- d5d6d7=357は7で割り切れる
- d6d7d8=572は11で割り切れる
- d7d8d9=728は13で割り切れる
- d8d9d10=289は17で割り切れる
-----
私の解答例は以下です。畳んでいます。
def g(n): import itertools t = "".join([str(i) for i in xrange(n)]) return ["".join(s) for s in itertools.permutations(t, n)] def f(n): L = [] for j in g(n): if int(j[1:4])%2: continue elif int(j[2:5])%3: continue elif int(j[3:6])%5: continue elif int(j[4:7])%7: continue elif int(j[5:8])%11: continue elif int(j[6:9])%13: continue elif int(j[7:10])%17: continue else:L.append(j) return L L = f(10) print sum([int(s) for s in L]) print L
9桁以下のpandigital数を生成しこれを素数判定することにしました。
pandigital数の定義がproblem38やproblem41と異なり、0~9までの10種類の数字で構成されます。
2つの関数を使っています。
1.関数g(n)
・n桁の0からn-1までの数字で構成されるpandigital数のリストを返します。
・1文字目に0がくることもあるので、数値型にせず文字型でためます。
・problem41は1からnまでのn桁のpandigital数リストなのでこれを改良しました。
2.関数f(n)
・問題の条件に合う値をリストLにためていきます。
3.関数の外
・L = f(10)
リストLは10桁(0-9)のpandigital数のリストです。
・print sum([int(s) for s in L])
print L
リストLの値を1つずつint関数で数字型にしてリストにため、sum関数で合計を計算します。
解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。
16695334890
['1406357289', '1430952867', '1460357289', '4106357289', '4130952867', '4160357289']
0 件のコメント:
コメントを投稿