codeiq @riverplus さんの「ロング・ロング・ストリング問題」を解いた

https://codeiq.jp/q/2683

作者による解説は
https://codeiq.jp/magazine/2016/03/38398/ (Wayback Machine 経由)

回答は
http://togetter.com/li/947393
でまとめられている。

問題はだいたいこんな感じ

自然数 n に対して、関数 F(n) を、n**n(n の n 乗)を 10 進数で表したときの桁数と定義します。
さらに、2 以上の自然数 m に対して、F(n) = m となる n の値を G(m) と定義します。
もしそのような n が存在しない場合は、G(m) = -1 と定義します。

標準入力から、自然数 m(2 ≦ m ≦ 1010)が与えられます。
標準出力に G(m) の値を出力するプログラムを書いてください。

rubyで書いたニュートン法の提出コードはこちら。
四捨五入しているところはちょっと怪しいと思ったけど、
テストケースが全部通ったので、とりあえずは深く考えずにそのままにしている。
自然対数じゃない対数の微分とか、高校以来かもしれない。

 m=gets.chomp.to_i
# 入力mに対して、10**m=n**n、すなわち n*log10(n)-m = 0 を満たす 
# 実数nを、ニュートン法で求める。
i = m
tmp = (i*Math.log10(i) - m )/(Math.log10(i) + 1/ Math.log(10))
while tmp.abs > 0.01
  i-=tmp
  tmp = (i*Math.log10(i) - m )/(Math.log10(i) + 1/ Math.log(10))
end
i=i.round # ここは大丈夫かな? # -1 になる条件をチェックしつつ出力。
puts (i*Math.log10(i)).ceil == m ? i : -1 

コメントを残す