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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2019, 21:05   #1
Stalin2019
Пользователь
 
Регистрация: 08.08.2019
Сообщений: 20
По умолчанию [Pascal] По номеру числа в последовательности простых чисел выдать само число

Здравствуйте, уважаемые форумчане. Задачу нужно решить без введения функций. Максимум все виды циклов.
Задача такая:
По номеру числа в последовательности простых чисел выдать само число.
Например: ввожу номер 1, выдает 2. Ввожу 2, выдает 3. Ввожу 3, выдает 5.
Мои мысли по задаче:
Код:
program prog;
uses crt;
var
   n,i,j,k,l,m:integer;
begin
write('Введите номер числа в последовательности простых чисел: ');
readln(n);
i:=0; {i будет отвечать за кол-во простых чисел}
k:=3; { пока не знаем до какого числа будем искать n-ое простое }
while (i<>n) do
 for j:=2 to k do { Перебираем числа от 2 до k}
   begin
   m:=0;  { m будет отвечать за количество делителей каждого числа}
   k:=k+1;
    for l:=1 to j do
    if j mod l=0 then
     m:=m+1;
     if (m=2) then i:=i+1; {Если у числа два делителя, то оно является простым. В этом случае увеличиваем i на 1}
   end;
   write(j);{Выводим число}
end.
Не работает. Что не так?
Stalin2019 вне форума Ответить с цитированием
Старый 15.08.2019, 13:02   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Очередное бредовое задание. Функции не применять. Может, и стандартные (Sqrt) не применять? Тогда это этюд на тему "чесать левое ухо правой ногой".
Если никто не откликнется, после обеда накропаю, разбираться в коде лень. Хоть я и не сталинист
digitalis вне форума Ответить с цитированием
Старый 15.08.2019, 16:55   #3
Stalin2019
Пользователь
 
Регистрация: 08.08.2019
Сообщений: 20
По умолчанию

Стандартные можно использовать. Заранее спасибо!
Stalin2019 вне форума Ответить с цитированием
Старый 15.08.2019, 19:25   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Вот тут что-то быстро сделал, но лучше разобраться и поправить.
Вроде работает.
Код:
uses crt;
var N: integer;
    k, m, i, j, p: integer;
    hbound: integer;

begin
   write('Vvod N:');
   readln(N);      {Nomer}
   if N = 1 then
   begin
      writeln('N = 1   Prostoe = 2');
      Halt;
   end;
   m := 2;         {первое простое}
   k := 1;         {его номер}
   while True do   {пока не найдем нужное простое}
   begin
      for j := m + 1 to 2*m do  {поиск следующего простого}
      begin
         p := 0;      {первый делитель}
         hbound := round(sqrt(j));
         for i := 2 to hbound do
         begin
            if ((j mod i) = 0) then {есть делитель}
            begin
               p := 1;
               Break;
            end;
         end;
         if (p = 0) then
         begin
            m := j;
            k := k + 1;
         end;
         if k = N then
            Break;

      end;
      if k = N then
         Break;
   end;
   writeln('N = ', N, '   Prostoe = ', m);
   readln();
end.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 15.08.2019, 19:30   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Решето Эратосфена для FreePascal.
Код:
{$BITPACKING ON}
program Eratosfen;

uses
  Windows; //для определения времени работы

const
  //номер искомого простого числа
  NPrime = 1000 * 1000 * 10;
  NPrimeMax = round(1.2 * NPrime * ln(NPrime));
type
  TVector = packed array [0..NPrimeMax] of boolean;
var
  PrimeCandidate, Step, j, Count, LastCandidate: QWord;
  Sieve: TVector;
  start, done: uint64;
  n: QWord;
  NMax: QWord;
begin
  writeln('Введите номер числа в последовательности простых чисел: ');
  readln(n);

  case n of
    1: PrimeCandidate := 2;
    2: PrimeCandidate := 3;
    else
    begin
      //верхняя граница рассматриваемых кандидатов в простые числа
      Nmax := round(1.4 * n * ln(n));

      start := GetCurrentTime;
      {заполнение решета Эратосфена}
      fillchar(Sieve, sizeof(Sieve), $AA);
      {особые случаи для 2 и 3}
      Sieve[0] := False;
      Sieve[1] := False;
      Sieve[2] := True;
      j := 9;
      while j <= Nmax do
      begin
        Sieve[j] := False;
        Inc(j, 6);
      end;
      {заполнение для простых чисел от 5}
      Count := 2;
      PrimeCandidate := 5;
      Step  := 2;
      LastCandidate := round(sqrt(Nmax)) + 1;
      while ((PrimeCandidate <= LastCandidate) or (Count < n)) do
      begin
        if Sieve[PrimeCandidate] then
        begin
          Inc(Count);
          //writeln(Count: 3, ' ', PrimeCandidate);
          if Count = n then
            break;
          j := sqr(PrimeCandidate);
          while (Nmax >= j) do
          begin
            Sieve[j] := False;
            Inc(j, PrimeCandidate);
          end;
        end;
        PrimeCandidate := PrimeCandidate + Step;
        Step := Step xor $6;
      end;
    end; {else}
  end;   {case}

  done := GetCurrentTime;

  writeln('prime = ', PrimeCandidate);
  writeln('Time = ', done - start, 'ms');
end.
FPaul вне форума Ответить с цитированием
Старый 15.08.2019, 20:07   #6
Stalin2019
Пользователь
 
Регистрация: 08.08.2019
Сообщений: 20
По умолчанию

Спасибо
Stalin2019 вне форума Ответить с цитированием
Старый 15.08.2019, 20:22   #7
Stalin2019
Пользователь
 
Регистрация: 08.08.2019
Сообщений: 20
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Вот тут что-то быстро сделал, но лучше разобраться и поправить.
Вроде работает.
Код:
uses crt;
var N: integer;
    k, m, i, j, p: integer;
    hbound: integer;

begin
   write('Vvod N:');
   readln(N);      {Nomer}
   if N = 1 then
   begin
      writeln('N = 1   Prostoe = 2');
      Halt;
   end;
   m := 2;         {первое простое}
   k := 1;         {его номер}
   while True do   {пока не найдем нужное простое}
   begin
      for j := m + 1 to 2*m do  {поиск следующего простого}
      begin
         p := 0;      {первый делитель}
         hbound := round(sqrt(j));
         for i := 2 to hbound do
         begin
            if ((j mod i) = 0) then {есть делитель}
            begin
               p := 1;
               Break;
            end;
         end;
         if (p = 0) then
         begin
            m := j;
            k := k + 1;
         end;
         if k = N then
            Break;

      end;
      if k = N then
         Break;
   end;
   writeln('N = ', N, '   Prostoe = ', m);
   readln();
end.
Не понял какую роль играет True.
Stalin2019 вне форума Ответить с цитированием
Старый 15.08.2019, 22:09   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Как я понял - это бесконечный цикл с выходом по Break. Это как если бы написали
if (1+1) = 2 . Оптимизатор компилятора, видимо, этот if выкинет и заменит на банальный jmp на начало цикла.
digitalis вне форума Ответить с цитированием
Старый 15.08.2019, 22:43   #9
Stalin2019
Пользователь
 
Регистрация: 08.08.2019
Сообщений: 20
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Как я понял - это бесконечный цикл с выходом по Break. Это как если бы написали
if (1+1) = 2 . Оптимизатор компилятора, видимо, этот if выкинет и заменит на банальный jmp на начало цикла.
Да,подставил вместо True Ваше условие, работает.Круто. Спасибо. Возьмем на вооружение.

Последний раз редактировалось Stalin2019; 15.08.2019 в 22:46.
Stalin2019 вне форума Ответить с цитированием
Старый 16.08.2019, 00:31   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Stalin2019
Цитата:
Не понял какую роль играет True.
В Паскале есть три типа циклов: while, repeat ... until и for.
В Python, например, есть только for и while.
В этом случае цикл типа repeat ... until реализуется через
Код:
while True:
   <что-то тут>
   if <условие>:
      break
   <и тут что-то>
Тут чисто условное пояснение. Мне это понравилось и когда надо выполнить цикл без определённого конца, как в предложенном случае, то делаю так.
Этот цикл будет выполняться до тех пор, пока не будет вычислено последнее простое число с заданным номером.

PS: Собственно вам дали пояснение.

PSS:
Смысл предложенного алгоритма - использовать предыдущее задание.
1. Задаётся первое простое число m
2. В диапазоне от m + 1 до 2*m ищем следующее простое число по ранее разработанному алгоритму.
3. Если нашли, то увеличиваем номер и поиск продолжаем от найденного
4. Если номер найденного простого числа совпадает с введённым, то завершаем работу.
Картинка была бы более понятной, если бы было можно использовать собственную функцию.
Думаю, что если бы сам разобрался и сделал с собственной функцией, то смог бы и решение отстоять. Препод мог бы на такое и не "лаять".
Но сколько тут "бы"
Как-то так, ...

Последний раз редактировалось ViktorR; 16.08.2019 в 00:39.
ViktorR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка Pascal ABC.NET. Дана последовательность натуральных чисел, Удалить из последовательности простые числа, а среди оставшихся продублировать числа... n3v3rlucky Помощь студентам 1 30.11.2017 10:44
с++ Вводится последовательность ненулевых чисел,0-конец последовательности, определить наибольшее число в последовательности ЮськаЮськовна Помощь студентам 3 10.11.2015 15:20
В последовательности чисел выдать на печать TRUE, если значение минимального числа меньше заданного числа К. Гарри Паскаль, Turbo Pascal, PascalABC.NET 6 08.11.2015 14:48