Предмет: Информатика, автор: beenchmark

Дана строка из n символов(все числа), заканчивающаяся нулем. Ноль в этой строке только 1. Требуется написать программу на Паскале, которая составит число-палиндром. Если таких чисел несколько то вывести минимальное из них. Нулей в числе быть не должно. Все имеющиеся цифры использовать не обязательно, но кол-во цифр должно быть максимально возможным

Ответы

Автор ответа: Segrif
0
{Вариант с поиском,
Пока что просто решил игнорировать 0, раз он все равно в конце}

var
 s: string;
 i,j,k,l: integer;
 t,f: boolean;
 mi,mj: integer;
 x,y:array[boolean] of integer;
begin
 mi := 1;
 mj := 0;
 readln(s);
 l := length(s); //- 1; {оканчивается на 0?}
 k := 1;
 f := true;
 while f and (k <= l) do
   begin
   f := s[k] <> '0';
   if f then k := k + 1
   end;
 x[false] := 1;
 y[false] := k - 1;
 x[true] := k + 1;
 y[true] := l;

 for f := false to true do
 for i := x[f] to y[f] do
 begin
 j := y[f];
 while j - i >= mj - mi do
   begin
   t := true;
   k := 0;
   while t and (k <= (j - i) div 2) do
     begin
     t := s[i + k] = s[j - k];
     k := k + 1
     end;
   if t then
   if j - i > mj - mi then
     begin
     mi := i;
     mj := j;
     end
   else
   if j - i = mj - mi then
     begin
     k := 0;
     t := true;
     while t and (k <= j - i) do
       begin
       t := s[i + k] = s[mi + k];
       if t then k := k + 1
       end;
     t := not t;
     if t then
       t := s[i + k] < s[mi + k];
     if t then
       begin
       mi := i;
       mj := j;
       end
     end;
   j := j - 1
   end
 end;
for k := mi to mj do
  write(s[k])
end.
----------------------------------------------


{Вариант с составлением}

var
 a: array['1'..'9'] of integer;
 i: integer;
 c: char;
 t: boolean;
 begin
 for c := '1' to '9' do
   a[c] := 0;
 repeat
   read(c);
   if (c >= '1') and (c <= '9') then
     a[c] := a[c] + 1;
 until c = '0';
 for c := '1' to '9' do
   for i := 1 to a[c] div 2 do
     write(c);
 c := '1';
 t := true;
 while t and (c <= '9') do
   begin
   if odd(a[c]) then
     begin
     write(c);
     t := false
     end;
   c := succ(c)
   end;
 for c := '9' downto '1' do
   for i := 1 to a[c] div 2 do
     write(c)

end.
Автор ответа: beenchmark
0
до нуля идет первое число, после нуля идет второе число
Автор ответа: beenchmark
0
тут 2 числа нам даны
Автор ответа: Segrif
0
Ладно. Минуту
Автор ответа: Segrif
0
Проверяйте
Автор ответа: beenchmark
0
магия вне хогвартса запрещена =)
Похожие вопросы
Предмет: Химия, автор: hsjshsududue
Предмет: Английский язык, автор: daniilgolubev784
Предмет: Обществознание, автор: selyukovam