Помощь - Поиск - Пользователи - Календарь
Полная версия: двусвязные список, последовтельность чисел
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Катюша
Ввести последовательность натуральных чисел. Если последовательность упорядочена по невозрастанию первой или последней цифры, удалить из последовательности составные числа и продублировать простые числа, содержащие цифры 1,5 или 7. В противном случае упорядочить последовательность по неубыванию. Последовательность хранить в двусвязном СПИСКЕ. Перед завершением программы очистить динамическую память с помощью процедуры Release.

помогите пожалуйста написать программу smile.gif
volvo
А вот тут поясни:
Цитата(Катюша @ 22.07.05 22:46)
удалить из последовательности составные числа

что подразумевает понятие "составные"? Не являющиеся простыми, или что-то другое?
Катюша
если там речь идет о простых числах, то наверняка подразумеваются числа (под словом "составные") которые на что то делятся, кроме как на себя и на единицу.

в принципе, думаю, что наш препод такое толкование бы допустил.. если бы вот такое пояснение привели..
volvo
Полностью программу писать не буду, но вот в таком направлении надо двигаться (TList - это реализация двухсвязного списка, я ее выкладывал на форуме, в теме про ООП, но можно взять и реализацию Oleg_Z отсюда):
{ проверка, простое ли число (взято из FAQ)... }
function isPrime(X: word): boolean;
var
  i: integer;
Begin
  isPrime:=false;
  for i:=2 to trunc(sqrt(x)) do
    if x mod i = 0 then Exit;
  isPrime:=true
End;

var
  my_list: tlist; { это двухсвязный список }
  i: integer;

  p: ptitem;
  is_ok: boolean;
  T: integer;
  digit_set: set of byte;
  before_list: Pointer;

begin
  my_list.init;

  mark(before_list); { потом к этому состоянию вернемся через release }

  for i := 1 to 10 do
    my_list.append(arr[i]); { заполняем список }
  my_list.print; { и печатаем, для проверки }

  { проверяем на упорядоченность }
  p := my_list.first;
  is_ok := true;
  while assigned(p) do begin

    if p^.next <> nil then
      { это проверка на невозрастание последней цифры,
         если надо - сюда же можешь добавить и первую,
         но так как числа могут быть и 1, и 2, и 3-значными,
         может возникнуть проблема }
      is_ok := is_ok and ((p^.info mod 10) >= (p^.next^.info mod 10));
    p := p^.next;

  end;

  if is_ok then begin { последовательность упорядочена, делаем что надо: }

    { опять проходим по списку с начала }
    p := my_list.first;
    while assigned(p) do begin

      if not isPrime(p^.info) then
        { число - составное, удаляем элемент }
        my_list.remove_item(p)
      else begin { число простое }
         { здесь - проверяем на наличие цифр 1, 5, 7 в числе
            я бы делал так: }
          T := p^.info;
          while T > 0 do begin
            digit_set := digit_set + [(T mod 10)]; T := T div 10;
          end;
          { если присутствует одна из цифр 1, 5, 7 то
             продублировать данное значение }
          if (1 in digit_set) or (5 in digit_set) or (7 in digit_set) then
            my_list.insert_after(p, p^.info);
      end;

      p := p^.next;

    end;
  end
  else begin
    { список неупорядочен - просто отсортируй его любым способом }
  end;

  my_list.print; { опять для проверки }

  { возвращаемся к ранее запомненному состоянию
     кучи - список будет удален }
  release(before_list);

end.
Катюша
посмотрю, что смогу сделать.. если будут вопросы- задам
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.