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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2011, 15:11   #1
Сергей505
Пользователь
 
Регистрация: 11.11.2011
Сообщений: 19
По умолчанию печатающую все простые числа

Составить программу на турбо паскале: напишите программу, печатающую все простые числа, не превосходящие данного числа.
Сергей505 вне форума Ответить с цитированием
Старый 11.11.2011, 17:20   #2
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

в for прокрути от 0 но N и каждое число проверяй на простоту
например по функции
Код:
bool prost(int p)
{
    bool is_prime = true;
    for(int i=2;i <= sqrt(p); ++i)
        if( p % i == 0 ) is_prime=false;
    return is_prime;
}
еще существует формула определения простоты для числа p
fact(p-1) + 1 mod p = 0 - число простое

Последний раз редактировалось Hemul; 11.11.2011 в 17:27.
Hemul вне форума Ответить с цитированием
Старый 11.11.2011, 18:26   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
function isPrime(X: LongInt): boolean;
var i: integer;
Begin
     isPrime:=false;
     if x<2 then Exit;
     if not odd(x) and (x<>2) { проверяем на чётность  }
          then exit;
     i:=3;
     while i <= sqrt(x) do { проверяем только нечётные }
     begin
          if x mod i = 0 then Exit;
          inc(i,2);
     end;
     isPrime:=true;
End;
var i, N : longint;
begin
   WriteLn('Введите N');
   for i:=1 to N do 
     if  isPrime(i) then Write(i,'  ');
   WriteLn;
   readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.11.2011, 16:04   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Серж, ты забыл вводить N

Вообще, не совсем все же правильно делать так - проверять в цикле все числа на простоту. Ведь при проверке каждого числа приходится всю работу проводить заново.. Вообще, хотя эти две задачи: проверка на простоту и поиск всех простых - конечно, очень близки, с точки зрения производительности их следует все же разделять. Более естественный и эффективный способ поиска простых известен со времен древних греков - т.н. Решето Эратосфена. Принцип очень прост, но проблема в том, что ему надо много памяти. Это проявление общей закономерности: либо быстро, либо компактно .

Я вот состряпал прожку, которая использует по одному биту на число:
Код:
{ finding prime numbers using Sieve of Eratosthenes
  by TinMan, programmersforum.ru }

const
  q= 256;

var
  a: array of set of byte;
  i,j,m,n: LongInt;
  b: set of byte;

begin
  write('enter a number: ');
  readln(n);
  SetLength(a,n div q+1);
  a[0]:= [0,1];
  for i:=2 to n do
    if not ((i mod q) in a[i div q]) then begin
      j:= i;
      while j<=n-i do begin
        j:= j+i;
        Include(a[j div q],j mod q);
      end
  end;
  for i:=0 to n div q do begin
    if i=n div q then m:= n mod q else m:= q-1;
    for j:=0 to m do
      if not (j in a[i]) then writeln(i*q+j)
    end;
end.
Выигрыш в скорости проявляется при больших числах. Например, при n=10^7, она считает (на моем компе) примерно 10 сек, а прога с проверкой каждого числа - 8 мин. Понятно, что относительное различие будет расти с ростом диапазона.
Конечно, обе проги можно еще оптимизировать, но все же общий результат останется тем же.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 12.11.2011, 18:22   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от TinMan
Серж, ты забыл вводить N
угу. точно. там пропущено Readln(N);
я это сделал не специально, но пусть это будет заданием для того, кто попытается использовать данный код.

Цитата:
Сообщение от TinMan
Вообще, не совсем все же правильно делать так - проверять в цикле все числа на простоту.
в принципе - я согласен.
Просто способ с последовательным получением простых чисел (то же решето Эратосфена), немного сложнее. Поэтому, часто именно в учебных задачах используется полный перебор.
он же простой, как топор!
Ну, теперь для всех страждущих знаний есть целых ДВЕ программы. Пускай выбирают.


TinMan, спасибо за замечание и код программы.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
НАЙТИ ВСЕ ПРОСТЫЕ ДЕЛИТЕЛИ НАТУРАЛЬНОГО ЧИСЛА N Dima170792 Помощь студентам 5 11.06.2011 21:46
Найти все простые числа в заданном диапазоне Nikita++ Помощь студентам 8 20.10.2010 20:05
найти из указанного диапазона все простые числа мария2507 Microsoft Office Excel 11 03.04.2010 17:38
определить все простые числа не превосходящие заданного N QBasic werus Помощь студентам 4 23.04.2009 13:32