Три символа алфавита могут быть закодированы в системе счисления по основанию 3, т.е. в троичной системе счисления. При этом под первым номером кодируется число 0, которое записано по условию как , т.е. символ F кодируется нулем. Вторым номером кодируется число 1 и его запись по условию N, откуда мы узнаем, что символ N кодируется цифрой 1. Тогда оставшийся символ S кодируется цифрой 2. И действительно, третьей идет комбинация символов S. Любой член в последовательности кодов может быть получен путем перевода в троичную систему числа, на единицу меньшего номеру этого члена (поскольку отсчет кодов идет с нуля, а члены последовательности нумеруются с единицы). Проверим наше построение для контрольного значения n99=NFNSS. 98(3)=10122 -> NFNSS, что соответствует условию. Теперь само решение. 7) 6(3)=00020 -> FFFSF 27) 26(3)=00222 -> FFSSS 90) 89(3)=10022 -> NFFSS 101) 100(3)=10201 -> NFSFN 196) 195(3)=21020 -> SNFSF
Var m, n: integer; s1, s2, s3: string; ms: array[1..9] of string; md: array[1..9] of string; m1: array[11..19] of string; me: array[1..9] of string; flag: boolean;
Write('Введите целое число от 1 до 1000: '); Readln(m); if (m < 1) or (m > 1000) then Writeln('Шутки шутим?') else if m = 1000 then Writeln('Одна тысяча ' + s3) else begin { сотни } n := m div 100; if n > 0 then begin Write(ms[n]); flag := true end; { десятки } m := m mod 100; if m = 0 then Writeln(' ', s3) else begin if (m > 10) and (m < 20) then begin if flag then Write(' '); Writeln(m1[m], ' ', s3) end else if m > 0 then begin n := m mod 10; m := m div 10; if m > 0 then begin if flag then Write(' ') else flag := true; Write(md[m]) end; if n <> 0 then begin { единицы } if flag then Write(' '); Write(me[n], ' '); case n of 1: Writeln(s1); 2..4: Writeln(s2); else Writeln( s3) end end else Writeln(' ', s3) end end end end.
Тестовое решение: Введите целое число от 1 до 1000: 314 триста четырнадцать рублей
При этом под первым номером кодируется число 0, которое записано по условию как , т.е. символ F кодируется нулем.
Вторым номером кодируется число 1 и его запись по условию N, откуда мы узнаем, что символ N кодируется цифрой 1. Тогда оставшийся символ S кодируется цифрой 2. И действительно, третьей идет комбинация символов S.
Любой член в последовательности кодов может быть получен путем перевода в троичную систему числа, на единицу меньшего номеру этого члена (поскольку отсчет кодов идет с нуля, а члены последовательности нумеруются с единицы). Проверим наше построение для контрольного значения n99=NFNSS.
98(3)=10122 -> NFNSS, что соответствует условию.
Теперь само решение.
7) 6(3)=00020 -> FFFSF
27) 26(3)=00222 -> FFSSS
90) 89(3)=10022 -> NFFSS
101) 100(3)=10201 -> NFSFN
196) 195(3)=21020 -> SNFSF
m, n: integer;
s1, s2, s3: string;
ms: array[1..9] of string;
md: array[1..9] of string;
m1: array[11..19] of string;
me: array[1..9] of string;
flag: boolean;
begin
flag := false; { Пока ничего не выведено }
s1 := 'рубль';
s2 := 'рубля';
s3 := 'рублей';
ms[1] := 'сто'; ms[2] := 'двести'; ms[3] := 'триста'; ms[4] := 'Четыреста';
ms[5] := 'пятьсот'; ms[5] := 'пятьсот'; ms[6] := 'шестьсот'; ms[7] := 'семьсот';
ms[8] := 'восемьсот'; ms[9] := 'девятьсот';
md[1] := 'десять'; md[2] := 'двадцать'; md[3] := 'тридцать'; md[4] := 'сорок';
md[5] := 'пятьдесят'; md[6] := 'шестьдесят'; md[7] := 'семьдесят';
md[8] := 'восемьдесят'; md[9] := 'девяносто';
m1[11] := 'одиннадцать'; m1[12] := 'двенадцать'; m1[13] := 'тринадцать';
m1[14] := 'четырнадцать'; m1[15] := 'пятнадцать'; m1[16] := 'шестнадцать';
m1[17] := 'семнадцать'; m1[18] := 'восемнадцать'; m1[19] := 'девятнадцать';
me[1] := 'один'; me[2] := 'два'; me[3] := 'три'; me[4] := 'четыре'; me[5] := 'пять';
me[6] := 'шесть'; me[7] := 'семь'; me[8] := 'восемь'; me[9] := 'девять';
Write('Введите целое число от 1 до 1000: ');
Readln(m);
if (m < 1) or (m > 1000) then Writeln('Шутки шутим?')
else
if m = 1000 then Writeln('Одна тысяча ' + s3)
else
begin
{ сотни }
n := m div 100;
if n > 0 then
begin
Write(ms[n]);
flag := true
end;
{ десятки }
m := m mod 100;
if m = 0 then Writeln(' ', s3)
else
begin
if (m > 10) and (m < 20) then
begin
if flag then Write(' ');
Writeln(m1[m], ' ', s3)
end
else
if m > 0 then
begin
n := m mod 10;
m := m div 10;
if m > 0 then
begin
if flag then Write(' ') else flag := true;
Write(md[m])
end;
if n <> 0 then
begin
{ единицы }
if flag then Write(' ');
Write(me[n], ' ');
case n of
1: Writeln(s1);
2..4: Writeln(s2);
else Writeln( s3)
end
end
else Writeln(' ', s3)
end
end
end
end.
Тестовое решение:
Введите целое число от 1 до 1000: 314
триста четырнадцать рублей