| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Program A2_15a; Var  n,k:integer;  begin    readln(n);    if(n=2) then      begin writeln('YES');readln; exit; end;    if(n mod 2
 = 0) then      begin
 writeln('NO');readln; exit; end;    k:=3;    while
 (k*k<=n) and (n mod k <>0) do k:=k+2;    if
 (k*k>n) then writeln('YES')               else writeln('NO'); 
    readln;  end. | // Program A2.15a; #include <iostream> 
 using namespace std; 
 int main() {  int n,k=3;    
 cin>>n;  if(n==2){cout<<"YES\n"; return 0;}  if(n%2==0
 ){cout<<"NO\n"; return 0;}  while(k*k<=n && n%k!=0) k=k+2;  if(k*k>n)cout<<"YES\n";  else
 cout<<"NO\n";     return 0; } | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
 | Program A2_15b; Var  n,k,p:integer;  begin    readln(n);    if(n=2)
 then      begin
 writeln('YES');readln; exit; end;    if(n mod 2
 = 0) or (n mod 3 = 0) then      begin
 writeln('NO');readln; exit; end;    k:=5; p:=2;    while
 (k*k<=n) and (n mod k <>0) do     
 begin  k:=k+ p; p:=6-p; end;    if
 (k*k>n) then writeln('YES')              
 else writeln('NO'); 
    readln;  end. | // Program A2.15b; #include <iostream> 
 using namespace std; 
 int main() {  int
 n,k=5,p=2;    
 cin>>n;    
 if(n==2){cout<<"YES\n"; return 0;}   if(n%2==0
 || n%3==0){cout<<"NO\n"; return 0;}    
 while(k*k<=n && n%k!=0) {k=k+p; p=6-p;}    
 if(k*k>n)cout<<"YES\n";     else
 cout<<"NO\n";     return 0; } | 
            Дано натуральное число N.  Проверить, является ли оно простым.
Число называется простым, если оно не имеет никаких делителей, кроме 1 и самого числа. Поэтому алгоритм почти ясен: надо проверить делится ли это число на возможные делители и если не делится ни на один возможный делитель – число простое. Из четных чисел, только число 2 является простым, поэтому в строке 6 проверяем, равняется ли число 2, а в строке 8 – четное ли оно. В задаче 2.13 мы отметили, что максимальным делителем у числа n  может быть n div 2 (n/2). В примечании к задаче 2.13 мы отметили, что в числе каждый делитель имеет свою пару. Например для числа 1024:
Делитель 2 имеет свою «пару» число 1024  div 2 = 512, а если не делится на 2, значит не делится и на n div 2.
Делитель 4 имеет свою «пару» число 1024  div 4 = 256, а если не делится на 2, значит не делится и на n div 4.
Делитель 8 имеет свою «пару» число 1024  div 8 = 128, а если не делится на 2, значит не делится и на n div 8.
Делитель 16 имеет свою «пару» число 1024  div 16 = 64, а если не делится на 2, значит не делится и на n div 16.
Делитель 32 имеет свою «пару» число 1024  div 32 = 32, а если не делится на 2, значит не делится и на n div 32.
Все пары делителей сошлись в числе 32 (32*32=1024). 
Отсюда и алгоритм:
Программа 2.15а. Исходное число n будем проверять делится ли оно на число k= 3, 5, 7 и т.д. до тех пор, пока   k*k<=n  - строка 11 (Вспомните: число 32 было последним меньшим делителем). И если проверены все возможные делители (обратите внимание: именно только возможные делители – нечетные числа , начиная с 3), и k*k стало больше n, то число простое – строка 12.
Программа 2.15b. В этой программе мы уменьшили количество проверяемых делителей. Вообще самым оптимальным было бы – проверять на деление на простые числа. Например, число 15 не может быть делителем, если делителями не являются простые числа 3 и 5, и зачем проверять на делимость на число 35, если уже проверили на числа 5 и 7? Но у нас нет набора простых чисел. Но у нас есть набор «кандидатов» в простые числа! Это числа вида  6*k +/- 1! (6*k + 1  и   6*k - 1) Удивительно, но все простые числа можно получить по этой формуле ( но не все числа этого вида – простые). При к=1 имеем 5 и 7, при к=2 имеем 11 и 13, при к=3 имеем 17 и 19. Вот так бы и дальше! Но, при к=4 имеем 23 и 25 (не простое, а жаль). Но все равно чисел такого вида меньше, чем всех нечетных. Выпишем   эти числа: 5, 7, 11, 13, 17, 19, …Каждое следующее число получается из предыдущего прибавлением 2 или 4 (и они чередуются: прибавляется 2, 4, 2, 4, 2, 4…).
В программе 2.15b ( строка 12) переменная p реализует такое прибавление (сначала p=2, а затем в цикле она вычисляется по формуле p = 6 – p: и получается 2, 4, 2, 4, 2, 4…).



















