Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2008, 21:02   #1
PAWLO1993
Пользователь
 
Регистрация: 24.03.2008
Сообщений: 31
По умолчанию програма которая виводит все простие числа от 1 до 1000000 до 1сек

Мне нужна програма которая виводит все простие числа от 1 до 1000000 до 1сек.
PAWLO1993 вне форума Ответить с цитированием
Старый 10.06.2008, 21:35   #2
puffin
 
Аватар для puffin
 
Регистрация: 06.06.2008
Сообщений: 8
По умолчанию

Код:
function isPrime(X: word): boolean;
         var
            i: LongInt;
         Begin
                isPrime:=false;
                for i:=2 to trunc(sqrt(x)) do
                        if x mod i = 0 then Exit;
                isPrime:=true;
         End;
Вроде бы...

А вообще, используй google.ru. По-любому что-то да найдется.

Последний раз редактировалось puffin; 10.06.2008 в 21:45.
puffin вне форума Ответить с цитированием
Старый 11.06.2008, 21:06   #3
(: SyLvEsTeR :)
Новичок
Джуниор
 
Регистрация: 11.06.2008
Сообщений: 1
По умолчанию

Ya dumayu dla novi4kov etu proqrammu mojno bolee leq4e i ponatnee napisat...
vot tak ya dumayu doljda rabotat..

Цитата:
uses crt;
var
i,j:longint;
k:integer;
begin
While i<=1000000 do
begin
k:=0;j:=1;
while j<=i do
begin
if i mod j=0 then
inc(k);
inc(j);
end;
if k=2 then
write(i);
inc(i);
end;
end.
Ya dumayu alqoritm ponaten... yesi budut trudnosti ,moqu obyasnit)))
(: SyLvEsTeR :) вне форума Ответить с цитированием
Старый 11.06.2008, 22:28   #4
PAWLO1993
Пользователь
 
Регистрация: 24.03.2008
Сообщений: 31
По умолчанию

Програму и я сам могу легко написать, но мне нужно, щтоби она считала до 1секунды.
PAWLO1993 вне форума Ответить с цитированием
Старый 11.06.2008, 22:53   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

До миллиона простые числа просеиваются очень быстро.
Нужна небольшая оптимизация.
- Проверка делителей до sqrt(x), т.е. max до 1000. Кроме того нужно проверять не все числа подряд (в качестве делителей), а только простые. До 1000 их всего 168, причем сгенерировать их можно по ходу цикла.
- ну и пропускать четные.

С такой оптимизацией (реализовано в Delphi) - 250мс
...
Ради любопытства проверил без оптимизации - простой перебор всех делителей - чуть больше секунды.

Последний раз редактировалось alexBlack; 11.06.2008 в 23:14.
alexBlack вне форума Ответить с цитированием
Старый 11.06.2008, 23:45   #6
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
До миллиона простые числа просеиваются очень быстро.
Нужна небольшая оптимизация.
- Проверка делителей до sqrt(x), т.е. max до 1000. Кроме того нужно проверять не все числа подряд (в качестве делителей), а только простые. До 1000 их всего 168, причем сгенерировать их можно по ходу цикла.
- ну и пропускать четные.

С такой оптимизацией (реализовано в Delphi) - 250мс
...
Ради любопытства проверил без оптимизации - простой перебор всех делителей - чуть больше секунды.
А каким образом были получены данные о скорости алгоритма ?
Можете код выложить?

А то мои ковыряния с GetTime ничево хорошего недали... Хотя это дело времени
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 11.06.2008, 23:53   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Просто разница в значениях getTickCount:

Код:
var prime : array [1..100000] of integer;
var C:integer;

procedure TForm1.Button1Click(Sender: TObject);
var N, k, m, i, T:integer;
    b:boolean;
    F:textFile;
begin
   T := getTickCount;
   C := 0;
   // 1 - не является простым числом
   // 2 - единственное четное простое число
   inc(C); prime[C] := 2;

   N := 3;
   while N < 1000000 do begin
      k := trunc(sqrt(N));

      m := 2;  // деление на 2 не проверяем
      b := true;
      while m <= C do begin
         if prime[m] > k then break;
         if N mod prime[m] = 0 then begin
            b := false;
            break;
         end;
         inc(m);
      end;

      if b then begin
         inc(C);
         prime[C] := N;
      end;

      inc(N, 2);
   end;
   T := getTickCount - T;
   memo1.Lines.add('time = '+intToStr(T));

   assignFile(F, 'prime.txt'); rewrite(f);
   for i:=1 to C do begin
      writeLn(F, prime[i]);
   end;
   closeFile(F);
   {
   for i:=1 to C do begin
      memo1.lines.Add( intToStr(prime[i]) );
      if i mod 1000 = 0 then Application.processMessages;
   end;
   }
   memo1.Lines.add('count = '+intToStr(C));
end;

Последний раз редактировалось alexBlack; 11.06.2008 в 23:56.
alexBlack вне форума Ответить с цитированием
Старый 12.06.2008, 01:15   #8
RAVAL))
Пользователь
 
Регистрация: 06.06.2008
Сообщений: 44
Восклицание

Самый быстрый способ нахождения простых чисел это "Решето Эратосфена"

Код:
 VAR
  A,P      : Array[1..1000000] of Longint;
  i,j,k,lp : Longint;
BEGIN
  Assign(Output,'Out.txt'); Rewrite(Output);
  lp:=1;
  P[1]:=2;
  k:=0;
  For i:=3 to 1000000 Do Begin
    If Odd(i)
      Then Begin Inc(k); A[k]:=i; End;
  End;
  For i:=1 to k Do Begin
    If a[i]=0 Then Continue;
    Inc(lp);
    P[lp]:=A[i];
    j:=i+P[lp];
    While (j<=k) Do Begin
      A[j]:=0;
      Inc(j,P[lp]);
    End;
  End;
  For i:=1 to lp Do WriteLn(P[i]);
  Close(Output);
END.
RAVAL)) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Програма чтения из файла на дельфи terminadoor Помощь студентам 18 03.07.2008 18:14
Запущена ли програма? RealSHELS Общие вопросы Delphi 4 14.06.2008 21:54
ДАНЫ 4 ЧИСЛА X Y Z W составит программу найти произведение все положительные нечетные числа Woland-itn Паскаль, Turbo Pascal, PascalABC.NET 3 23.03.2008 21:49
Програма для вывода геометрической фигуры Hworang Паскаль, Turbo Pascal, PascalABC.NET 8 30.10.2007 19:42
Програма тестирования студентов. lin Помощь студентам 6 20.04.2007 09:23