Удалить из списка все узлы, до и после которых находятся узлы с информационными...

0 голосов
47 просмотров

Удалить из списка все узлы, до и после которых находятся узлы с информационными составляющими, являющимися числами Фибоначчи.

Двунаправленный список.


Информатика (15 баллов) | 47 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Средствами PascalABC.NET 3.2 эта задача решается очень просто.

1. Короткое решение, оставляющее в недоумении: а для чего тут было использовать двусвязный список? ответ: потому что таково задание!

// PascalABC.NET 3.2, сборка 1439 от 09.05.2017
// Внимание! Если программа не работает, обновите версию!

function IsFib(n:integer):boolean;
begin
  if (n=1) or (n=2) then Result:=true
  else begin
    Result:=false;
    (var n1, var n2):=(1,2);
    var Fib:integer;
    repeat
      Fib:=n1+n2;
      if Fib=n then begin Result:=true; break end;
      (n2,n1):=(Fib,n2)
    until Fib>n
    end;
end;

begin
  var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList;
  L:=L.Where(x->not IsFib(x)).ToLinkedList;
  L.Println
end.

Пример
n= 9
-> 3 17 13 10 12 4 11 0 5
17 10 12 4 11 0

2. Несколько более длинное решение для желающих немного порулить удалением узлов.

Функция остается той же, а изменения делаются в главной программе.

begin
  var L:=ReadSeqInteger('->',ReadInteger('n=')).ToLinkedList;
  var a:=L.Where(x->IsFib(x)).ToArray; // список значений для удаления
  foreach var t in a do L.Remove(t); // собственно удаление узлов
  L.Println
end.

3. Бонус. Как это сделать без двусвязного списка (опять же, основная программа).

begin
  var a:=ReadSeqInteger('->',ReadInteger('n='))
      .Where(x->not IsFib(x)).ToArray;
  a.Println
end.


(150k баллов)