На вход программе подается набор символов, заканчивающийся точкой (в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка, или считывать данные из файла). Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая сначала будет определять, есть ли в этом наборе символы, соответствующие десятичным цифрам. Если такие символы есть, то можно ли переставить их так, чтобы полученное число было симметричным (читалось одинаково как слева направо, так и справа налево). Ведущих нулей в числе быть не должно, исключение – число 0, запись которого содержит ровно один ноль.
Если требуемое число составить невозможно, то программа должна вывести на экран слово “NO”. А если возможно, то в первой строке следует вывести слово “YES”, а во второй – искомое симметричное число. Если таких чисел несколько, то программа должна выводить максимальное из них. Например, пусть на вход подаются следующие символы:
Do not 911 to 09 do.
В данном случае программа должна вывести
YES
91019
Посчитаем сколько различных цифр в строке, занесём эти данные в массив. Затем проверим есть ли цифры встречающиеся нечётное число раз, запомним какое число встречается нечётное число раз. Проверим, есть ли цифры встречающиеся более одного раза или есть ли цифры встречающиеся один раз, при том, чтобы ноль не встречался. Если цифр встречающихся нечётное число раз более одной или условие, описанное в предыдущем предложении ложно выведем "NO"; иначе выведем "YES", а затем сначала половину каждой из цифр, начиная с девятки, затем выведем запомненную цифру, оставшуюся половину цифр.
var a:array['0'..'9'] of integer;
c, c_odd: char;
i, k: integer;
f: boolean;
begin
for c:='0' to '9' do a[c]:=0;
read(с);
while c<>'.' do
begin
if c in ['0' .. '9'] then a[c] := a[c] + 1;
read(c);
end;
k := 0; {количество цифр, встречающихся нечетное число раз}
for c := '0' to '9' do
if a[c] mod 2 = 1 then
begin
k := k + 1;
c_odd := c;
end;
f := (a['0'] = 1);
for c := '1' to '9' do
if (a[c] > 1) or (a[c] = 1) and (a['0'] = 0) then f := true;
if (k > 1)or not f then writeln('NO') else
begin
writeln('YES');
for c := '9' downto '0' do
for i := 1 to a[c] div 2 do
write(c);
if k = 1 then
write(c_odd);
for c := '0' to '9' do
for i := 1 to a[c] div 2 do
write(c);
end
end.


C4 № 3102.
егэ по информатике.
Думаю один из этих способов решения будет менее объемный и затратный
var ar: array[0..9] of integer;
i,k,nr:integer;
s:string;
c:char;
begin
while c<>'.' do begin
read(c);
if c in ['0'..'9'] then begin
k:=ord(c)-ord('0');
ar[k]:=ar[k]+1;
end;
end;
for i:=9 downto 1 do
if (ar[i] mod 2 = 0)and(ar[i]<>0) then begin
nr:=1; insert(inttostr(i),s,9-i);end;
if nr=1 then begin writeln('YES'); write(s);
if ar[0]>0 then write('0'); end
else writeln('NO');
end.
или
var ar: array[0..9] of integer;
i,k,nr:integer;
c:char;
begin
while c<>'.' do begin
read(c); if c in ['0'..'9'] then begin
k:=ord(c)-ord('0'); ar[k]:=ar[k]+1;
end;end;
for i:=9 downto 1 do
if (ar[i] mod 2 = 0)and(ar[i]<>0) then nr:=1;
if nr=1 then writeln('YES') else writeln('NO');
for i:=9 downto 1 do
if (ar[i] mod 2 = 0)and(ar[i]<>0) then write(i);
if (ar[0]>0)and(nr=1) then write('0');
for i:=1 to 9 do
if (ar[i] mod 2 = 0)and(ar[i]<>0) then write(i);
end.
bainy58 (tomsk) 04.06.2013 21:40:
var ar: array[0..9] of integer;
i,k,nr:integer;
c:char;
begin
while c<>'.' do begin
read(c); if c in ['0'..'9'] then begin
k:=ord(c)-ord('0'); ar[k]:=ar[k]+1;
end;end;
for i:=9 downto 1 do
if (ar[i] mod 2 = 0)and(ar[i]<>0) then nr:=1;
if nr=1 then writeln('YES') else writeln('NO');
for i:=9 downto 1 do
if (ar[i] mod 2 = 0)and(ar[i]<>0) then write(i);
if (ar[0]>0)and(nr=1) then write('0');
for i:=1 to 9 do
if (ar[i] mod 2 = 0)and(ar[i]<>0) then write(i);
end.
ошибка вот здесь if (ar[i] mod 2 = 0)and(ar[i]<>0) then nr:=1;
Допустим если в числе есть хоть одно число встречающиеся чётноё кол во раз. Отвтет в любом случае будет Yes без разницы можно ли составить полиндром или нет. пример
вводной строки
9849
.
выход программы
YES
99