http://projecteuler.net/problem=26 循環小数1/d(d < 1000)のうち、循環の長さが最大となるdを求める。 そもそも循環するかどうかと10^x - 1がdで割れるかどうかを見た。 ソースコード中ではcycleの仮引数nがdと対応している。 {{{#!highlight ruby #!/usr/bin/env ruby def cycle(n) # 2と5は循環の長さには影響しない n /= 2 while n % 2 == 0 n /= 5 while n % 5 == 0 # 循環の長さは'(10^x - 1) % n == 0となるxの長さ'-1と等しい i = 10 loop do return 0 if i % n == 0 return i.to_s.length - 1 if (i - 1) % n == 0 i *= 10 end end cycle_len = (1...1000).map(&method(:cycle)) p cycle_len.index(cycle_len.max) + 1 }}}