/* Euler #26 in Picat. """ A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given: 1/2 = 0.5 1/3 = 0.(3) 1/4 = 0.25 1/5 = 0.2 1/6 = 0.1(6) 1/7 = 0.(142857) 1/8 = 0.125 1/9 = 0.(1) 1/10 = 0.1 Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle. Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => go. go => time(euler26). % , time(euler26b). euler26 => MaxLen = 0, MaxD = 0, foreach (D in 2..999) if prime(D) then Len = get_rep_len(D), if Len > MaxLen then MaxLen := Len, MaxD := D end end end, println([maxD=MaxD,maxLen=MaxLen]). euler26b => M = [[get_rep_len(D),D]: D in 2..999, prime(D)].sort_down(), writeln(M[1]). % % Get the length of the repeating cycle for 1/n % get_rep_len(I) = Len => FoundRemainders = [0 : _K in 1..I+1], Value = 1, Position = 1, while (FoundRemainders[Value+1] == 0, Value != 0) FoundRemainders[Value+1] := Position, Value := Value*10, Value := Value mod I, Position := Position+1 end, Len = Position-FoundRemainders[Value+1].