Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

Простые числа   Найти похожие ветки 

 
JediMaster   (2004-02-06 13:00) [0]

Подскажите алгоритм для поиска простых чисел, нужно найти числа от 0 до 15000, простой метод(искать делители) не пойдет.
За ранее спасибо :)


 
Sandman25 ©   (2004-02-06 13:03) [1]

Вычеркиваете из списка кандидатов всех, которые делятся на 2. Потом те, которые делятся на минимальное из оставшихся (кроме него самого). И так пока не дойдете до конца.

PS. "Вычеркнуть четные" можно при занесении в массив, конечно.


 
MBo ©   (2004-02-06 13:04) [2]

Просто заноси найденные простые числа в список, и проверяй делимость только на них.


 
MV   (2004-02-06 13:12) [3]

Алгиритма нэт! Просто заноси найденные простые числа в список, и проверяй делимость только на них. И все!


 
Sandman25 ©   (2004-02-06 13:21) [4]

const N = 15000;

for I := 2 to N do
A[I] := N;
Current := 2;
while (Current <= N) do
begin
if A[Current] <> 0 then
for J := 2 TO N div I do
A[J*Current] := 0;
Inc(Current);
end;

for I := 2 to N do
if A[I] <> 0 then
showmessage(inttostr(I));


 
Sandman25 ©   (2004-02-06 13:24) [5]

А еще лучше так:
const N = 15000;

fillchar(@A[2], SizeOf(A[2])*(N-1), 1);
for Current := 2 to N do
begin
if A[Current] <> 0 then
for J := 2 TO N div I do
A[J*Current] := 0;
end;

for I := 2 to N do
if A[I] <> 0 then
showmessage(inttostr(I));


 
pasha_golub ©   (2004-02-06 13:25) [6]

Решето Эратосфена.

Реализайций море. Можно с массивом, но накладно с памятью, а можно с битовыми операциями. Дык, прикинем... 15000 / 8 = 1875 байт потребуется, для нынешних машин это пшык. Удачи.


 
Sandman25 ©   (2004-02-06 13:27) [7]

Решето Эратосфена.

Точно. А то не мог вспомнить название :)


 
Serginio666   (2004-02-06 13:44) [8]

Function TNewInt32Hash.ProstoeChislo(v: Cardinal): Cardinal;
VAR i:Cardinal;
Find:Boolean;
Begin

Result:=v or 1;
Find:=true;

While true do
Begin
i:=3;

While i<Trunc(Sqrt(result)) do
Begin
If (result mod i)= 0 Then
Begin
Find:=false;
break
end
Else inc(i,2);
end;

If Find Then
exit
else
begin
Find:=true;
inc(result,2);
end;
end;

End;


 
Brahman ©   (2004-02-06 14:07) [9]

Проще и быть не может:)

for i:=0 to N-1 do A[i] := i;
num:=0;
for i := 2 to N-1 do begin
if A[i] <> 0 then inc(num);
j := i + i;
while j <= N-1 do begin
A[j] := 0;
j := j + i;
end;
end;


 
JediMaster   (2004-02-06 14:13) [10]

Нужно не от 0 до 15000, а первые 15000 чисел.
Всем спасибо за помощь :)


 
Serginio666   (2004-02-06 14:15) [11]

Brahman © (06.02.04 14:07) [9]
Ну ну и так до 1 ГБ ?????


 
Serginio666   (2004-02-06 15:07) [12]

http://www.rsdn.ru/Forum/Message.aspx?mid=48059&only=1


 
nikkie ©   (2004-02-06 15:18) [13]

>Нужно не от 0 до 15000, а первые 15000 чисел.
по формулам Чебышева можно оценить величину N-ого простого. после этого решето Эратосфена. например, как в [9] Brahman. только если вместо
j := i + i;
делать
j := i * i;
то быстрее получится.


 
Brahman ©   (2004-02-06 16:45) [14]

nikkie © (06.02.04 15:18) [13]

За одним маленьким исключением - верхний предел меньше или
надо переходить на BigInt



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
7-53800
maxXP
2003-12-02 19:23
2004.02.17
Как определить нажата, отпущена кокретная клавиша клавиатуры a-z


6-53670
pepper
2003-12-08 15:25
2004.02.17
Сетевой диск


1-53587
Mikka
2004-02-08 12:45
2004.02.17
Динамическое создание и удаление объектов


1-53487
Вованчик
2004-02-06 08:00
2004.02.17
Как исключить Qtintf70.dll из дистрибутива?


14-53771
Kerk
2004-01-27 14:25
2004.02.17
Merak Mail Server