Линейный алгоритм -- это описание действий, которые выполняются однократно в заданном порядке.
Циклический алгоритм -- это описание действий, которые повторяются указанное число раз или пока не выполнено заданное условие. (Перечень повторяющихся действий -- тело цикла)
Разветвляющийся алгоритм — алгоритм, в котором в зависимости от условия выполняется либо та, либо другая последовательность действий. Смешанный алгоритм -- это алгоритм, в котором могут соединиться разные виды алгоритмов. (Например, циклический и линейный)
type ListSimple = class l := new List<int64>(); procedure AddSimple(N: int64); begin var Result := True;
var num := n; while num > 0 do begin if not (num mod 10 in [2,3,5,7]) then begin Result := False; break; end; num := num div 10; end; if not Result then exit;
for var i: int64 := 2 to round(sqrt(N)) do if N mod i = 0 then begin Result := False; break; end; // lock не позволяет нескольким потокам одновременно выполнять эту секцию. // Это обязательно, иначе если несколько потоков одновременно будут пытаться добавить значение в список, список может оказаться испорченным // Секция, охраняемая lock, называется критической lock l do if Result then l.Add(N); end; end;
var hh := 100000;
begin var ls := new ListSimple; var ii: int64 := 2;
Parallel.For(ii, ii + hh, ls.AddSimple); writeln(ls.l.Count); ls.l := ls.l.OrderBy(x->x).ToList(); //- это можно включить для проверки того, что в обоих списках - одинаковые простые числа for var i := 0 to ls.l.Count - 1 do writeln(i+1,' - ',ls.l[i]);
writeln; writeln('Время выполнения = ', Milliseconds); end.