Олимпиадное задание. Стеки - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите решить задачку через стеки : 'Есть одна последовательность, так называемая 'Треугольная' строится она следующим образом: S(1) = { 1 }; S(2) = { 1,2,1 }; S(3) = { 1,2,1,3,1,2,1 }; S(n) = { S(n - 1), i, S(n - 1) }; Необходимо разработать способ, который будет находить число на k - й позиции в n - ом члене. 1 <= n,k <= 2^64; Если в члене n нет такой позиции, т.е. k > length(S(n)) то вывести No solution.'

Решение задачи: «Олимпиадное задание. Стеки»

textual
Листинг программы
uses
  SysUtils;
 
function f(k: QWord): Integer;
var
  i: Integer;
begin
  for i := 0 to 63 do
    if k and (QWord(1) shl i) <> 0 then
      exit(i + 1);
  exit(65);
end;
 
var
  sn, sk: String;
  n, k: QWord;
begin
  ReadLn(sn);
  ReadLn(sk);
  n := StrToQWordDef(sn, 0);
  k := StrToQWordDef(sk, 0);
  if (k = 0) and ((n = 0) or (n > 64)) then
    WriteLn('65')
  else if (n <> 0) and (k >= QWord(1) shl n) then
    WriteLn('No solution')
  else
    WriteLn(f(k));
end.

Объяснение кода листинга программы

  1. В функции f(k: QWord): Integer; реализован алгоритм проверки битовых полей числа k на наличие единицы в каждом из них.
  2. В основной части программы считываются строки sn и sk, которые интерпретируются как числа n и k соответственно.
  3. Если k равно нулю и n равно нулю или больше 64, то выводится число 65.
  4. Если n не равно нулю и k больше или равно QWord(1) shl n, то выводится строка No solution.
  5. В противном случае выводится результат работы функции f(k).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы