Олимпиадное задание. Стеки - 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.
Объяснение кода листинга программы
- В функции
f(k: QWord): Integer;
реализован алгоритм проверки битовых полей числаk
на наличие единицы в каждом из них. - В основной части программы считываются строки
sn
иsk
, которые интерпретируются как числаn
иk
соответственно. - Если
k
равно нулю иn
равно нулю или больше 64, то выводится число 65. - Если
n
не равно нулю иk
больше или равноQWord(1) shl n
, то выводится строкаNo solution
. - В противном случае выводится результат работы функции
f(k)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д