2012年8月26日日曜日

Project Euler - Problem 52

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

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

コメントを投稿