type violla = set of 1..300; //описывается тип "множество". //В множества такого типа могут входить целые числа из диапазона от 1 до 300 var i, j, k, n: integer; // целые переменные s, s1: violla; // s и s1 - переменные множественного типа f: boolean; // f - логическая переменная begin write('Введите n: '); // На экран выводится текст 'введите n: ' readln(n); // Пользователь должен ввести с клавиатуры целое число s := [];s1 := []; // множественным переменным задаются начальные значения - пустые множества for i := 1 to n do //начало цикла с параметром, который выполняется заданное количество (n) раз begin f := true; //логической переменной присваивается начальное значение k := round(sqrt(i)); //вычисляется квадратный корень из текущего значения параметра sqrt(i) и округляется до целого // почему вычисляется корень и делители ищутся только из диапазона от 2 до round(sqrt(i)) - смотри алгеру //формально можно задать k:=i-1, но это будет неэффективно, хотя и правильно for j := 2 to k do // во вложенном цикле с параметром j определяется if i mod j = 0 then f := false; // есть ли такие j, на которые i делится без остатка (=0). //Если хотя бы один делитель у числа i есть, то переменной f будет присвоено значение false if f then s := s + [i] //если не нашлось ни одного делителя, //то значение f остается true и значение этой переменной добавляется в множество s else s1 := s1 + [i]; //в противном случае значение переменной добавляется в множество s1 end; //Таким образом, в s накапливаются простые числа, а в s1 - составные write('Простые числа(только два делителя): '); for i := 1 to n do //Для вывода содержимого множества на экран используется цикл с параметром // все числа от 1 до введенного n проверяются на принадлежность множеству (i in s) if i in s then write(i, ' '); //если значение i есть в множестве s, то оно выводится на экран writeln; write('Составные числа(более двух делителей): '); // с множеством s1 - fyfkjubxyj for i := 1 to n do if i in s1 then write(i, ' '); end.