-------------------------------------------- -- Josephus problem using a discrete loop -- -------------------------------------------- with Gnat.IO, Ada.Numerics.Aux; use Gnat.IO, Ada.Numerics.Aux; procedure main is -- function ceiling: function ceiling (r: double) return positive is begin if r <= 0.0 then raise constraint_error; elsif double(positive (r)) = r then return positive (r); else return positive (r) + 1; end if; end ceiling; -- function josephus: N...number of suicides, m...cycle length function josephus (N: positive; m: positive) return positive is x : positive; a : double; begin a := double(m); discrete d := 1 in 1..((m-1)*N) new d := ceiling((a/(a-1.0))*double(d)) loop d := ceiling((a/(a-1.0))*double(d)); x := d; end loop; return m*N+1-x; end josephus; N, m : integer; begin put ("------------------"); new_line; put ("josephus algorithm"); new_line; put ("------------------"); new_line (2); loop put ("number of suicides (0 to quit) ? "); get (N); exit when N <= 0; put ("length of cycle (> 1) ? "); get (m); if m > 1 then put ("--> survivor = "); put (josephus (N, m)); else put ("--> invalid circle length!"); end if; new_line (2); end loop; new_line; put ("Bye, bye!"); new_line; end main;