「プロジェクトオイラー問99」の編集履歴(バックアップ)一覧はこちら
「プロジェクトオイラー問99」(2014/03/04 (火) 12:02:07) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2099
*Problem 99 「最大のべき乗」 †
指数の形で表される2つの数, 例えば 2^11 と 3^7, の大小を調べることは難しくはない. 電卓を使えば, 2^11 = 2048 < 3^7 = 2187 であることが確かめられる.
しかし, 632382^518061 > 519432^525806 を確認することは非常に難しい (両者ともに300万桁以上になる).
各行に1組が書かれている1000個の組を含んだ22Kのテキストファイル base_exp.txt から, 最大の数が書かれている行の番号を求めよ.
注: ファイル中の最初の二行は上の例である.
解法
Logを使っても十分答えが出るようです。
本当は精度の関係からこのような計算は邪道なのですがほかの方も同じような解法のようです。
calc([],_,Ans,Ans):-!.
calc([[X,Y]|Rows],RowNo,[LogNum,_],Result):-
Log1 is log(X)*Y,
Log1>LogNum,
!,
RowNo1 is RowNo+1,
calc(Rows,RowNo1,[Log1,RowNo],Result).
calc([_|Rows],RowNo,NowAns,Result):-
!,
RowNo1 is RowNo+1,
calc(Rows,RowNo1,NowAns,Result).
main99:-
open('pe99.txt',read,IS),
read_term(IS,Rows,[]),
close(IS),
calc(Rows,1,[-1,-1],Ans),
write(Ans).