|
Нахождение простых чисел (решето Эратосфена)
Простые числа в промежутке от 2 до n можно найти, используя решето Эратосфена. В последовательности чисел 2, 3, 4, ... , n вычеркнем каждое число после 2. Первое невычеркнутое число - простое (число 3). Далее вычеркиваем каждое третье число после 3 (при вычеркивании учитываются уже отброшенные числа). Первое невычеркнутое число - простое (5). Теперь вычеркиваем каждое пятое число и т.д. до тех пор, пока не дойдем до числа, большего √n. Все оставленные числа являются простыми. Действительно, если положительное число n>1 не делится ни на какое положительное число, не большее √n, то оно является простым. Составим программу. Размерность массива простых чисел должна быть задана в основной программе. Количество простых чисел равняется j. Программа работает следующим образом. Сначала задаются первые два простые числа (2 и 3). Потом все непарные числа m от 5 до n проверяются, не являются ли они простыми. Эта проверка заключается в делении числа m последовательно на все простые числа от 3 до числа, не большего √m. Если число m не имеет простых множителей в интервале (3,5, ... , √m), то оно является простым и осуществляется его запись в массив p. {erat.pas Сайт Algorithm (http://www.algorithm1.narod.ru/) Автор проекта: Galina}
const r=300; type ar=array[1..r] of integer; var n,kol,i:integer; prost:ar; procedure erat(n1:integer; var p:ar; var j:integer); {j - кол-во простых чисел} var m,k,s:integer; b:boolean;{b - флаг, если b=true, то m - простое, иначе - составное} begin p[1]:=2;p[2]:=3; {задание первых 2 простых чисел} j:=2; {задание номера второго простого числа} m:=3; {задание начального значение числа m (m=3)} repeat {перебор нечетных чисел от 5 до n} m:=m+2; s:=trunc(sqrt(m)+0.1); b:=true; k:=2; while b and (p[k]<=s) do if m mod p[k]=0 then b:=false else k:=k+1; if b then begin j:=j+1; p[j]:=m; end;{если b=true, то m - простое} until m>n1-2 end;
begin writeln('Введите n'); readln(n); erat(n,prost,kol); writeln('Простые числа на промежутке от 2 до ',n); for i:=1 to kol do writeln(prost[i]); end.
|
| Автор проекта: Galina |