ВЫРАЖЕНИЕ: "Я рад, что учусь в Домашней школе!"
Сдвиг на 29 букв вперед
Объяснение:
Шифр Цезаря один из наиболее древнейших известных шифров. Схема шифрования очень проста — используется сдвиг буквы алфавита на фиксированное число позиций. Используемое преобразование обычно обозначают как ROTN, где N — сдвиг, ROT — сокращение от слова ROTATE, в данном случае «циклический сдвиг».
Алфавит действительно зацикливается, то есть буквы в конце алфавита преобразуются в буквы начала алфавита. Например, обозначение ROT2 обозначает сдвиг на 2 позиции, то есть, «а» превращается в «в», «б» в «г», и так далее, и в конце «ю» превращается в «а» а «я» — в «б». Число разных преобразований конечно и зависит от длины алфавита. Для русского языка возможно 32 разных преобразования (преобразования ROT0 и ROT33 сохраняют исходный текст, а дальше начинаются уже повторения). В связи с этим шифр является крайне слабым и исходный текст можно восстановить просто проверив все возможные преобразования.
// PascalABC.NET 3.2, сборка 1417 от 28.03.2017
// Внимание! Если программа не работает, обновите версию!
begin
var k:=Arr(1,2,5,10); // номиналы монет
var m:=ReadArrInteger('Кол-во монет по '+k.JoinIntoString+' руб:',4);
var n:=ReadInteger('Сумма в купюрах, руб:');
if m.Zip(k,(p,q)->p*q).Sum<n then begin // нехватка монет
Writeln('Размен невозможен'); exit
end;
var s:=''; // для результатов
for var i:=k.Length-1 downto 0 do
if (n>=k[i]) and (m[i]>0) then begin // номинал участвует
var t:=min(n div k[i],m[i]); // кол-во монет
n:=n-k[i]*t; // остаток
if s.Length>0 then s+=', ';
s+=t+' по '+k[i]+' руб.';
end;
if n<>0 then Writeln('Размен невозможен')
else Writeln(s)
end.
Примеры
Кол-во монет по 1 2 5 10 руб: 350 215 86 130
Сумма в купюрах, руб: 1526
130 по 10 руб., 45 по 5 руб., 1 по 1 руб.
Кол-во монет по 1 2 5 10 руб: 500 146 0 38
Сумма в купюрах, руб: 432
38 по 10 руб., 26 по 2 руб.
Кол-во монет по 1 2 5 10 руб: 10 20 30 40
Сумма в купюрах, руб: 25000
Размен невозможен