日本語翻訳サイトは、プロジェクトオイラー日本語 でネット検索してください。
問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 件のコメント:
コメントを投稿