본문 바로가기

Julia

오일러 프로젝트 26 (Julia)

1000 이하의 자연수에서 그 역수가 순환소수가 될 때, 순환마디가 가장 긴 값을 찾는 문제이다. 분수를 소수로 표현하려면 실제로 나눗셈을 계산해야 한다. 매 자리에서 몫과 나머지가 나오는데, 나머지에 10을 곱하고 그 아랫자리를 더하면 다음 번 나누는 수(피제수)가 된다.

피제수가 같다면 몫과 나머지가 같을 것이므로, 같은 몫이 나올 때 까지의 구간의 길이를 구하면 된다.

function process(n)
  d = 1
  m = []
  while true
    q, r = divrem(d, n)
    d in m && break
    push!(m, d)
    d == 0 && return 0
    d = r * 10
  end
  return length(m)
end

function main()
  3:2:1000 .|> (x -> (process(x), x)) |> maxinum |> last |> println
end

main()