program CircularPrimes;
function IsPrime(n: Integer): Boolean;
var
i, limit: Integer;
begin
if n = 2 then
Exit(True);
if (n < 2) or (n mod 2 = 0) then
Exit(False);
limit := Trunc(Sqrt(n));
i := 3;
while i <= limit do
begin
if n mod i = 0 then
Exit(False);
Inc(i, 2);
end;
IsPrime := True;
end;
function CyclicallyRotateLeft(n: Integer): Integer;
var
m, p: Integer;
begin
m := n;
p := 1;
while m >= 10 do
begin
p := p * 10;
m := m div 10;
end;
CyclicallyRotateLeft := (n mod p) * 10 + m;
end;
function IsCircularPrime(n: Integer): Boolean;
var
rotated_n: Integer;
begin
if (n < 2) then
Exit(False);
rotated_n := CyclicallyRotateLeft(n);
while rotated_n <> n do
begin
if (rotated_n < n) or (not IsPrime(rotated_n)) then
Exit(False);
rotated_n := CyclicallyRotateLeft(rotated_n);
end;
IsCircularPrime := True;
end;
var
testNumbers: array[1..5] of Integer = (197, 1193, 23, 101, 119);
i: Integer;
begin
for i := 1 to Length(testNumbers) do
begin
if IsCircularPrime(testNumbers[i]) then
WriteLn(testNumbers[i], ': Circular Prime')
else
WriteLn(testNumbers[i], ': Not Circular Prime');
end;
end.
// 1193
// 1193 = prime
// 3119 = prime
// 9311 = prime
// 1931 = prime
(*
run:
197: Circular Prime
1193: Circular Prime
23: Not Circular Prime
101: Not Circular Prime
119: Circular Prime
*)