Как проверить, простое ли число
Перебирайте делители от 2, пока d * d <= n. Если ни один не подошёл — число простое:
program PrimeCheck;
var
n, d: longint;
begin
readln(n);
if n < 2 then
writeln(n, ' не является простым')
else
begin
d := 2;
while (d * d <= n) and (n mod d <> 0) do
d := d + 1;
if d * d > n then
writeln(n, ' — простое')
else
writeln(n, ' делится на ', d, ', не простое');
end;
end.9191 делится на 7, не простоеЦикл останавливается либо на первом делителе, либо когда d * d перерос n. После цикла достаточно проверить, по какой причине он закончился.
Почему до корня
Делители идут парами: 91 = 7 · 13, 36 = 4 · 9 = 6 · 6. В каждой паре один делитель не больше корня из числа. Значит, если до корня делителей нет, их нет и дальше. Для числа около миллиона это тысяча проверок вместо миллиона.
Условие пишут как d * d <= n, а не d <= sqrt(n): так обходятся без дробных чисел и их погрешностей.
Особые случаи
- 0 и 1 не простые — по определению простое число больше 1.
- 2 — простое, единственное чётное простое.
- Отрицательные числа простыми не считаются.
Функция IsPrime
Проверку удобно оформить функцией и вызывать для многих чисел:
function IsPrime(x: longint): boolean;
var
d: longint;
begin
IsPrime := x >= 2;
d := 2;
while d * d <= x do
begin
if x mod d = 0 then
begin
IsPrime := false;
exit;
end;
d := d + 1;
end;
end;Функцию описывают перед главным begin программы, а вызывают в условии: if IsPrime(n) then …. Пример вывода всех простых до n с этой функцией — в уроке Задачи школьного курса.
Решето Эратосфена
Чтобы найти все простые числа до N, быстрее не проверять каждое, а вычёркивать кратные: 2 простое — вычёркиваются 4, 6, 8…; 3 простое — вычёркиваются 9, 12, 15…; и так далее. Что осталось невычеркнутым — простые.
program Sieve;
const
N = 50;
var
composite: array[2..N] of boolean;
i, j: integer;
begin
for i := 2 to N do
composite[i] := false;
for i := 2 to N do
if not composite[i] then
begin
write(i, ' ');
j := i * i;
while j <= N do
begin
composite[j] := true;
j := j + i;
end;
end;
writeln;
end.2 3 5 7 11 13 17 19 23 29 31 37 41 43 47Вычёркивать начинают с i * i: меньшие кратные уже вычеркнуты меньшими простыми. Массив composite («составное») сначала заполняется false — пока ничего не вычеркнуто.
Подводные камни
- Цикл до n. Перебор до самого
nдаёт верный ответ, но для больших чисел работает в тысячи раз дольше. - Начали с 1. Делитель 1 есть у любого числа — перебор начинают с 2.
- Переполнение. Для
n, близких к пределуlongint(около двух миллиардов),d * dна последних шагах может не поместиться вlongint— тогда описывайтеnиdкакint64.