Skip to content

Instantly share code, notes, and snippets.

@AtsushiSakai
Last active December 21, 2015 01:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save AtsushiSakai/6230192 to your computer and use it in GitHub Desktop.
Save AtsushiSakai/6230192 to your computer and use it in GitHub Desktop.
マーティン・ガードナーの最難問を解くPython Script
#coding:utf-8
'''
マーティン・ガードナーの最難問を解くPython Script
解けるかな? 史上最難問10題 : ギズモード・ジャパン http://www.gizmodo.jp/2013/08/_so_you_th.html?utm_source=rss20&utm_medium=rss
ある数の粘度は、すべての桁を掛けて出る答えが1桁になるまでにかかる積算の回数で表す。
それぞれの桁の数を掛け算して出るのが2番目の数で、そのまた全桁の数を掛けて出るのが3番目の数…こうして1桁の数が出るまでやり、
出るまでに重ねた掛け算の回数を数えるのだ。
例えば、77は粘度4だ。なぜなら1桁になるまで4回掛け算しなきゃならないからね(77-49-36-18-8)。
粘度1で一番小さい数は10、粘度2で一番小さい数は25、粘度3で一番小さい数は39、粘度4の最小数は77だ。
では、粘度5で一番小さい数は何?
Author : Atsushi Sakai
Copyright (c): 2013 Atsushi Sakai
License : Modified BSD Software License Agreement
'''
print "Martin Gardner Solver start!!"
maxNum=1000000 #粘度を計算する最大数
result={} #各粘度最小値格納用変数
#粘度を1から一つづつ計算
for i in range(maxNum):
stri=str(i)#数字を文字列に変換
vis=1#粘度
#粘度の計算
while 1:
num=1#桁数を掛け合わせた値
for ii in range(len(stri)):#各桁を掛けあわせる
num*=int(stri[ii])
#桁数のチェック
if len(str(num))<=1:
print str(i)+"'s viscosity is "+str(vis)
if ~result.has_key(vis):
result.setdefault(vis,i)#DBに各粘度の最小値を登録
break
else:
vis+=1#粘度をインクリメント
stri=str(num)#もう一度各桁を掛け合わせる
#各粘度の最小値の結果を表示
print "=====Viscosity Result====="
print result.items()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment