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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2006, 00:37   #1
Buch
Новичок
Джуниор
 
Аватар для Buch
 
Регистрация: 13.12.2006
Сообщений: 1
По умолчанию Кольцевой список и простые числа

Есть задачка на динамическую память... Необходимо составить программу, которая каждый элемент кольцевого однонаправленного списка с заглавным элементом увеличивает на 3, а затем вычеркивает те из них, которые будут простыми.
Так вот проблема в поиске простых чисел (удаление пока не трогаю, хотя оно тоже криво работает, выдает ошибку "ссылка на не существующий указатель). До 14и она работает нормально, а с 15и начинается дребедень:
1. 15 - простое, дальше правильно, 21 - опять считает простым, потом 25, потом 35, дальше не проверял...
2. Если в списке присутствует 1 (кроме случая, когда она последняя), то система проверки на простые числа вообще не работает.
Вот код:
Код:
program kos;

{$APPTYPE CONSOLE}

uses
  SysUtils;

Type pe=^el;                {Указатель на элемент списковой структуры}
      el=record             {Элемент списка}
      inf:integer;          {Информационное поле типа integer}
      next:pe               {Указатель на следующий элемент}
  end;


//функция вывода на экран списка P
function vivod(p:pe):boolean;
var lastp:pe;
begin
lastp := p^.next;
while lastp <> p do
 begin
 Write(lastp^.inf, ' ');
 lastp := lastp^.next;
 end;
WriteLn(' ]');
vivod := true;
end;


Var
temp, lastp, p: pe;
i, n, k: integer;



Begin

//контроль значения количества элементов
{$I-}
Write('Vvedite kolichestvo elementov: ');
ReadLn(n);
Writeln;
while (n<=0) or (ioresult<>0) do
  begin
  Writeln('Kolichestvo elementov dolgno bit` celim CHISLOM, HE men`she i HE ravno `0` ');
  Write('Vvedite kolichestvo elementov: ');
  ReadLn(n);
  Writeln;
  end;
{$I+}

//построения КОС с включенным заглавным элементом
Writeln('Vvedite ', n, ' celih chisel!');
    new(p);
    p^.next:=p;
    lastp:=p;
For i:=1 to n do
  begin
    new(lastp^.next);
    lastp:=lastp^.next;
    Write('Vvedite ',i,' element spiska: ');
    ReadLn(lastp^.inf);
    end;
lastp^.next:=p;


//вывод списка P на экран
Write('Spiska P = [ ');
vivod(p);


//удаление элементов, являющихся простыми числами
  lastp := p^.next;
while lastp <> p do
  begin
  if (lastp^.inf=2) or (lastp^.inf=3) then
    begin
    writeln('prostie (2 ili 3) - ', lastp^.inf);
     { temp := lastp^.next;
      dispose(lastp);
      lastp := temp;
      break;      //удаление тоже криво работает    }
    end
  else
  if lastp^.inf<2 then
    begin
    break;
    end
  else
  for k:=2 to trunc(sqrt(lastp^.inf)) do
  if lastp^.inf mod k = 0 then
    begin
    break;
    end
 else
      begin
      writeln('prostie - ', lastp^.inf);
     { temp := lastp^.next;
      dispose(lastp);
      lastp := temp;
      break;      //удаление тоже криво работает    }
      break;
      end;
  lastp := lastp^.next;
  end;


  Write('It`s FINISH');
  readln

end.
Подскажите плиз, в чем ошибка!?
Buch вне форума Ответить с цитированием
Старый 13.12.2006, 07:13   #2
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Натуральное число называется ПРОСТЫМ если оно днлится только на 1 и на само себя.
В теории чисел есть теоремка что если у натурального числа N нет делителей в отрезке от [2, корень(N)] то это число простое.

k:=0 // счетчик количества делителей
i:=2;
while (i<=round(sqrt(n)))and(k=0)
// пока i пренодлежит отрезку и имеет 0 делителей
if n mod i = 0 then k:=k+1;
i:=i+1;
end;

если k=0 то N-простое.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кольцевой линейный список Seafulf Паскаль, Turbo Pascal, PascalABC.NET 7 16.11.2013 20:02
Простые числа werser Помощь студентам 8 18.06.2008 07:24
[Pascal]Двусвязный кольцевой список, несколько процедур Fuaran8989 Фриланс 1 25.05.2008 20:22
Кольцевой список blade288 Помощь студентам 3 02.12.2007 20:53
Кольцевой односвязный список jukk Общие вопросы Delphi 3 22.12.2006 12:10