СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
Информатика
Cайты, меню, вход, новости


Задания
Версия для печати и копирования в MS Word
Задания Д19 C4 № 3102

На вход программе подается набор символов, заканчивающийся точкой (в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка, или считывать данные из файла). Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, 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.

Спрятать решение · · Видеокурс ·
bainy58 (tomsk) 04.06.2013 21:40

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.

Никита Завьялов 06.04.2014 15:04

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