# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2026 # require 'mathn' # 素因数に2と5以外を持つ整数の逆数が循環小数となる. def recurring_decimal?(n) pd = n.prime_division pd.select{|p| p[0] == 2 || p[0] == 5}.size != pd.size end # 循環節の長さを求める. # m = 1 % d # を初期値として # m = (m * 10) % d # を繰り返したとき, # 過去に出現したmが再度出現したところまでが循環節である. def repetend_length(d) mods = {} i = 0 m = 1 % d begin i = i.next mods[m] = i m = (m * 10) % d end until (mods.member?(m)) (i - mods[m]) + 1 end # 1 ... 1000までの循環節の長さを求め,長さがもっとも長くなるdを表示する. puts (1 ... 1000).map {|d| [recurring_decimal?(d) ? repetend_length(d) : -1, d] }.max.pop