Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var c: char;

num: array[1..9] of integer;

I, k, count: integer;

sL, sR: string;

begin

{ ввод данных, подсчет количества цифр }

for i:=1 to 9 do num[i] := 0;

repeat

read(c);

if ('1' <= c) and (c <= '9') then begin

k := Ord(c) - Ord('0');

num[k] := num[k] + 1;

end;

until c = '0';

{ строим левую sL и правую sR части }

sL := '';

sR := '';

for i:=1 to 9 do

while num[i] > 1 do begin

c := Chr(i+Ord('0'));

sL := sL + с;

sR := c + sR;

num[i] := num[i] - 2;

end;

{ центральная цифра }

i := 1;

while (i < 10) and (num[i] = 0) do

i := i + 1;

if i < 10 then sL := sL + Chr(i+Ord('0'));

{ вывод результата }

writeln(sL + sR);

end.

  1. Задача очень похода на предыдущую, но вместо цифр используются символы английского алфавита. Значит, заводим массив для всех символов, удобнее всего – с символьным индексом:

num: array['A'..'Z'] of integer;

При чтении нужно все строчные буквы преобразовать в соответствующие прописные. Для этого из кода символа нужно вычесть разницу кодов букв «а» и «А»:

if ('a' <= c) and (c <= 'z') then

c := Chr(Ord(c) - Ord('a') + Ord('A'));

Для того, чтобы в конце программы определить, все ли символы использованы, мы будем считать все английские буквы с помощью счетчика count. Полный цикл ввода получается такой:

count := 0;

repeat

read(c);

if ('a' <= c) and (c <= 'z') then

c := Chr(Ord(c) - Ord('a') + Ord('A'));

if ('A' <= c) and (c <= 'Z') then begin

num[c] := num[c] + 1;

count := count + 1;

end;

until c = '.';

Поскольку нужно последнее по алфавиту слово, поиск пар нужно выполнять от 'Z' до 'A':

for i:='Z' downto 'A' do

while num[i] > 1 do begin

sL := sL + i;

sR := i + sR;

num[i] := num[i] - 2;

end;

Центральный символ должен быть максимальным, поэтому ищем его, начиная с 'Z':

i := 'Z';

while (i >= 'A') and (num[i] = 0) do

i := Pred(i);

if i >= 'A' then sL := sL + i;

Здесь функция Pred возвращает предыдущее значение для порядкового типа, в данном случае – предыдущий символ в кодовой таблице, имеющий код на единицу меньше. Есть также и функция Succ, возвращающая следующее порядковое значение.

Для того, чтобы определить, все ли символы задействованы, мы «сложим» левую и правую части результата и сравним длину получившейся строки со счетчиком count. Если они отличаются или ни одного нужного символа не найдено, строку-палиндром составить нельзя.

s := sL + sR;

if (Length(s) = count) and (count > 0) then begin

writeln('Да');

writeln(s);

end

else

writeln('Нет');

Вот полная программа:

Var c, I: char;

num: array['A'..'Z'] of integer;

k, count: integer;

s, sL, sR: string;

begin

{ обнуление счетчиков }

for i:='A' to 'Z' do num[i] := 0;

{ ввод данных, подсчет количества символов }

count := 0;

repeat

read(c);

{ строчные -> прописные }

if ('a' <= c) and (c <= 'z') then

c := Chr(Ord(c) - Ord('a') + Ord('A'));

if ('A' <= c) and (c <= 'Z') then begin

num[c] := num[c] + 1;

count := count + 1;

end;

until c = '.';

{ строим левую sL и правую sR части }

sL := '';

sR := '';

for i:='Z' downto 'A' do

while num[i] > 1 do begin

sL := sL + i;

sR := i + sR;

num[i] := num[i] - 2;

end;

{ центральный символ }

i := 'Z';

while (i >= 'A') and (num[i] = 0) do

i := Pred(i);

if i >= 'A' then sL := sL + i;

{ вывод результата }

s := sL + sR;

if (Length(s) = count) and (count > 0) then begin

writeln('Да');

writeln(s);

end

else

writeln('Нет');

end.

  1. Эта задача фактически представляет собой вариант задач 26-27. В отличие от задачи 26,

  • цепочка заканчивается не точкой, а нулем

  • нужно составить палиндром из ВСЕХ найденных цифр, или сказать, что это невозможно (аналогично задаче 27)

  • нужно вывести максимальный, а не минимальный палиндром

В отличие от задачи 27, используются не буквы, а цифры. Но есть ещё одна особенность, на которую обратил внимание автора И. Титков: поскольку по условию ведущих нулей в числе быть не должно, то в ответ на входные строки

0000000. или 1000000.

программа должна выдать ответ ’NO’ (палиндром без ведущих нулей составить нельзя). Как «отловить» эти варианты? В первом случае все цифры – нули, поэтому справедливо условие

num['0'] = count

Во втором случае есть одна ненулевая цифра, а остальные – нули, поэтому выполняется условие

num['0'] = count-1

Чтобы обеспечить вывод ответа ’NO’, достаточно в этих случаях записать в num['0'] единицу, тогда условие Length(s)= count в блоке вывода окажется ложно. Таким образом, перед построением левой и правой частей палиндрома нужно добавить оператор (поправку предложил И. Титков):

if (num['0']=count) or (num['0']=count-1) then

num['0']:=1;

Приведем полное решение:

Соседние файлы в папке ЕГЗ_2012_Поляков_май