2012年9月2日日曜日

プロジェクトオイラー 問56

プロジェクトオイラーの問題をpythonでやってみます。
日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索してください。

問56「aのb乗の形の自然数について桁の和の最大値を求めよ」
Googol (10100)は非常に大きな数である: 1の後に0が100個続く.
100100は想像を絶する. 1の後に0が200回続く.
その大きさにも関わらず, 両者とも桁の和は1である.

a, b < 100について自然数abを考える. 桁の和の最大を答えよ.

-----


注意!!!
自力で解きたい人へ
以降の記述には解法に関するネタバレが含まれます。






私の解答例は以下です。畳んでいます。
def f(n):
	L = [0, 0, 0]
	for i in xrange(n):
		for j in xrange(n):
			s = sum([int(k) for k in list(str(i**j))])
			if L[2]<s: L = [i, j, s]
	return L

n = 100
i,j,t = f(n)
print t," = ", i, "**",j


1.関数f(n):
・n未満の整数i,jについて、iのj乗の各桁の合計値が最大になるときの
 i,j,およびiのj乗の各桁の合計値を返します。

・for i in xrange(n):
  for j in xrange(n):
 ループ変数i,jにはn未満の整数を1つずつ設定します。

・s = sum([int(k) for k in list(str(i**j))])
 sはiのj乗の各桁の合計値です。
 **演算子は累乗です。i**jでiのj乗です。
 これをstr関数で各桁ごとの文字のリストにします。
 内包表記で、このリストから1つずつループ変数kに設定しint関数で数値に変換した値のリストを作ります。
 そしてsum関数でこのリストの合計値を計算します。

・if L[2]<s: L = [i, j, s]
 iのj乗とその桁和値sについて、リストLにこの順でとっておきます。
 L[2]は桁和値です。
 この桁和値についてリストL保存値よりも計算値sが大きい場合、
 その計算値sとこのときのi,jをリストLに保存します。

2.関数の外
・n = 100
 i,j,t = f(n)
 print t," = ", i, "**",j
 問題に合うように100未満の数値を対象にして、
 関数fで問題に合う数値のリストを取得し、表示します。
 
解答はこのすぐ下の行です。文字の色を白にしてます。選択状態にすると見えます。
972  =  99 ** 95


(追記)
・20130129 ネタバレ注意の追記など

0 件のコメント:

コメントを投稿