5) Проверим предлагаемые варианты ответов. - Г = 1: Явно однозначности нет: 101 можно расшифровать как В или ГАГ. Итак, одним битом букву Г закодировать нельзя, попробуем двумя. - Г = 11: можно! Получится префиксный код (потому расшифровка будет однозначной). - Г = 01. Однозначности нет: 0101 расшифровывается как ГГ или АВ. Дальше проверять бессмысленно: 010 состоит из 3 битов. ответ. 2) 11.
7) Опять проверяем. - Г = 11. Нет однозначности: 11 может быть расшифровано как ББ или Г. - Г = 000: подходит, т.к. получается префиксный код. Остальные варианты не короче этого. ответ. 2) 000.
Для справки. Префиксным кодом называется такой кодировки, при котором код никакого символа не начинается кодом другого символа (т.е. если, например, код символа 'a' есть 01001, то все остальные коды символов не могут начинаться на 01001...). Еще бывают постфиксные коды (когда коды не могут оканчиваться кодами других символов). Префиксные и постфиксные коды можно расшифровать однозначно (однако бывают коды, не являющиеся постфиксными или префиксными, но при этом допускающие однозначную расшифровку)
Var n,fibn:real; i:integer; begin readln(n); if n<=0 then writeln('Не существует чисел Фиббоначи меньше 0') else begin i:=0; while fibn<n do begin fibn:=(power((1+sqrt(5))/2,i)-power((1-sqrt(5))/2,i))/sqrt(5); inc(i); end; writeln((power((1+sqrt(5))/2,i)-power((1-sqrt(5))/2,i))/sqrt(5)-1); end; end.
//В лоб
Var sum,n,buf,fib0,fib1:integer;
function fibb(fib0,fib1:integer):integer; begin result:=fib0+fib1; end;
begin fib0:=0; fib1:=1; readln(n); if n<=0 then writeln('Не существует чисел Фиббоначи меньше 0') else begin if fibb(fib0,fib1)>=n then sum:=0 else begin while fibb(fib0,fib1)<n do begin buf:=fib1; fib1:=fibb(fib0,fib1); fib0:=buf; end; sum:=fibb(fib1,fibb(fib0,fib1))-1; end; writeln(sum); end; end.
- Г = 1: Явно однозначности нет: 101 можно расшифровать как В или ГАГ.
Итак, одним битом букву Г закодировать нельзя, попробуем двумя.
- Г = 11: можно! Получится префиксный код (потому расшифровка будет однозначной).
- Г = 01. Однозначности нет: 0101 расшифровывается как ГГ или АВ.
Дальше проверять бессмысленно: 010 состоит из 3 битов.
ответ. 2) 11.
7) Опять проверяем.
- Г = 11. Нет однозначности: 11 может быть расшифровано как ББ или Г.
- Г = 000: подходит, т.к. получается префиксный код.
Остальные варианты не короче этого.
ответ. 2) 000.
Для справки. Префиксным кодом называется такой кодировки, при котором код никакого символа не начинается кодом другого символа (т.е. если, например, код символа 'a' есть 01001, то все остальные коды символов не могут начинаться на 01001...). Еще бывают постфиксные коды (когда коды не могут оканчиваться кодами других символов). Префиксные и постфиксные коды можно расшифровать однозначно (однако бывают коды, не являющиеся постфиксными или префиксными, но при этом допускающие однозначную расшифровку)
//Вариант по формуле Бине
Var
n,fibn:real;
i:integer;
begin
readln(n);
if n<=0 then writeln('Не существует чисел Фиббоначи меньше 0')
else
begin
i:=0;
while fibn<n do
begin
fibn:=(power((1+sqrt(5))/2,i)-power((1-sqrt(5))/2,i))/sqrt(5);
inc(i);
end;
writeln((power((1+sqrt(5))/2,i)-power((1-sqrt(5))/2,i))/sqrt(5)-1);
end;
end.
//В лоб
Var
sum,n,buf,fib0,fib1:integer;
function fibb(fib0,fib1:integer):integer;
begin
result:=fib0+fib1;
end;
begin
fib0:=0;
fib1:=1;
readln(n);
if n<=0 then
writeln('Не существует чисел Фиббоначи меньше 0')
else
begin
if fibb(fib0,fib1)>=n then sum:=0 else
begin
while fibb(fib0,fib1)<n do
begin
buf:=fib1;
fib1:=fibb(fib0,fib1);
fib0:=buf;
end;
sum:=fibb(fib1,fibb(fib0,fib1))-1;
end;
writeln(sum);
end;
end.
Пример ввода:
12
Пример вывода:
20