出典: Project Euler(日本語 翻訳サイト)
ProjectEuler.net(英語サイト)
Problem 52
125874を2倍すると251748となる. これは元の数125874と同じ数を含む.
2x, 3x, 4x, 5x, 6xがxと同じ数を含むような最小の正整数xを求めよ.
-----
私の解答例は以下です。畳んでいます。
def f(): for i in xrange(1, 10000000): s = set(str(i)) for j in xrange(2, 7): t = set(str(i*j)) if s!=t: break else: return i print f()
1.関数f(n)
・for i in xrange(1, 10000000):
iは1からの連番です。10000000は、とりあえずの終了値です。
結果的に6桁で問題に合う値に到達します。
・s = set(str(i))
連番iをstr関数で文字型にして、set関数で集合型にします。
集合型にすることで、1文字ずつの重複要素を削除し、構成要素だけの集合にします。
・for j in xrange(2, 7):
jは掛ける数です。範囲は2から6までです。
・t = set(str(i*j))
連番iと掛ける数jの積について、上記iと同様に構成要素だけの集合にします。
・if s!=t: break
元の連番とj倍した値のそれぞれの構成要素が異なれば、ループ変数iの次の値へ処理を進めます。
・else: return i
ループ変数jのfor文のelseです。
for文のelseは、for文を全部最後の要素まで回り終わった場合に実行します。
途中でループを抜けた場合には実行されません。
ここでは上記if文ででbreakぜずに、2倍値から6倍値までのすべてで、その構成要素が元の数iの構成要素と同じ場合にだけ、そのiを呼び出し元に返します。
2.関数の外
関数f()を呼び出し、その戻り値を出力します。
解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。
142857
0 件のコメント:
コメントを投稿