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

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

Спрятать критерии
Критерии проверки:

Кри­те­рии оце­ни­ва­ния вы­пол­не­ния за­да­нияБаллы
Про­грам­ма ра­бо­та­ет для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра и на­хо­дит ответ, не со­хра­няя вход­ные дан­ные в мас­си­ве. Про­грам­ма про­смат­ри­ва­ет вход­ные дан­ные один раз. До­пус­ка­ет­ся на­ли­чие в тек­сте про­грам­мы одной син­так­си­че­ской ошиб­ки: про­пу­щен или не­вер­но ука­зан знак пунк­ту­а­ции, не­вер­но на­пи­са­но или про­пу­ще­но за­ре­зер­ви­ро­ван­ное слово языка про­грам­ми­ро­ва­ния, не опи­са­на или не­вер­но опи­са­на пе­ре­мен­ная, при­ме­ня­ет­ся опе­ра­ция, не­до­пу­сти­мая для со­от­вет­ству­ю­ще­го типа дан­ных (если одна и та же ошиб­ка встре­ча­ет­ся не­сколь­ко раз, то это счи­та­ет­ся за одну ошиб­ку).4
Про­грам­ма ра­бо­та­ет верно, но вход­ные дан­ные за­по­ми­на­ют­ся в мас­си­ве, раз­мер ко­то­ро­го со­от­вет­ству­ет числу N. Этот мас­сив, воз­мож­но, потом сор­ти­ру­ет­ся. До­пус­ка­ет­ся на­ли­чие от одной до трех син­так­си­че­ских оши­бок. Воз­мож­но, в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ном вводе дан­ных есть одна ошиб­ка (на­при­мер, ис­поль­зо­ва­ние read вме­сто readln в Пас­ка­ле или не­вер­ное счи­ты­ва­ние стро­ки в C++). Три балла также вы­став­ля­ет­ся, если в эф­фек­тив­ной про­грам­ме, удо­вле­тво­ря­ю­щей кри­те­ри­ям вы­став­ле­ния 4 бал­лов, есть одна ошиб­ка, в ре­зуль­та­те ко­то­рой про­грам­ма ра­бо­та­ет не­вер­но на не­ко­то­рых на­бо­рах не­ти­пич­ных вход­ных дан­ных.3
Про­грам­ма ра­бо­та­ет в целом верно, эф­фек­тив­но или нет, но в ре­а­ли­за­ции ал­го­рит­ма со­дер­жит­ся до двух оши­бок (не­вер­ная ини­ци­а­ли­за­ция счётчи­ков, до­пу­ще­на ошиб­ка в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ной сор­ти­ров­ке или ал­го­рит­ме по­ис­ка ми­ни­маль­ных эле­мен­тов, ис­поль­зу­ет­ся знак “<” вме­сто “<=”, “or” вме­сто “and” и тому по­доб­ное).

Воз­мож­но, не­кор­рект­но ор­га­ни­зо­ва­но счи­ты­ва­ние вход­ных дан­ных. До­пус­ка­ет­ся на­ли­чие от одной до пяти син­так­си­че­ских оши­бок, опи­сан­ных выше

2
Про­грам­ма, воз­мож­но, не­вер­но ра­бо­та­ет при не­ко­то­рых вход­ных дан­ных, но по при­ведённому тек­сту ре­ше­ния ясно, что эк­за­ме­ну­е­мый по­ни­ма­ет, из каких эта­пов долж­но со­сто­ять ре­ше­ние за­да­чи. При ис­поль­зо­ва­нии сор­ти­ров­ки она может быть ре­а­ли­зо­ва­на прин­ци­пи­аль­но не­вер­но (на­при­мер, вме­сто двух цик­лов ис­поль­зу­ет­ся один), или до­пу­ще­на прин­ци­пи­аль­ная ошиб­ка в по­ис­ке нуж­ных эле­мен­тов. Всего до­пус­ка­ет­ся до 4 раз­лич­ных оши­бок в ре­а­ли­за­ции ал­го­рит­ма, в том числе опи­сан­ных в кри­те­ри­ях при­сво­е­ния двух бал­лов. До­пус­ка­ет­ся на­ли­чие от одной до семи син­так­си­че­ских оши­бок, опи­сан­ных выше.1
За­да­ние не вы­пол­не­но или вы­пол­не­но не­вер­но.0
Мак­си­маль­ный балл4
Гость 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