Напишите, , программу, которая составляет из цифр введённой строки число-палиндром максимальной длины (которое читается одинаково слева направо и справа налево). если таких чисел несколько, нужно вывести минимальное из них. все имеющиеся цифры использовать не обязательно, но количество цифр в ответе должно быть максимально возможным. язык программирования паскаль входная строка содержит цифры (по крайней мере, одну) и, возможно, другие символы. программа должна вывести число-палиндром максимальной длины, которое можно составить из цифр входной строки. примеры входные данные for i: =99921 downto 2 выходные данные 29192

n1kitat n1kitat    2   02.10.2019 01:20    73

Ответы
superbogdanova superbogdanova  09.10.2020 10:44
PascalABC.NET 3.4.2, сборка 1864 от 11.11.2018Внимание! Если программа не работает, обновите версию!

begin

 var s := ReadlnString;

 var s1 := s.Where(t -> t in ['0'..'9']).Sorted.GroupBy(t -> t)

     .Select(c -> (c.Key, c.Count)).OrderBy(t -> t[0]).ToArray;

 var s2 := s1.Where(t -> t[1] > 1).Select(t -> t[0] * (t[1] div 2))

     .JoinIntoString('').Replace('0', '');

 var s3 := s1.Where(t -> t[1] = 1);

 if s3.Count > 0 then s2 := s2 + s3.Select(t -> t[0]).First + s2.Inverse

 else s2 := s2 + s2.Inverse;

 s2.Println

end.

Примерfor i:=99921 downto 229192
ПОКАЗАТЬ ОТВЕТЫ
жпжрдмдопнулуу жпжрдмдопнулуу  09.10.2020 10:44

program RawTcherv;

 

function IncPost(var I:integer):integer;

begin

 Result:=I;

 Inc(I);

end;

 

// из символов 1...9 из входной строки составить палиндром с минимальным значением

function (const S:string):string;

var

 A:array[1..9] of byte;

 I,J,Fino,Cur,Center:integer;

begin

 FillChar(A{%H-},sizeof(A),0);

 // вычисляем количество разных цифр, встреченных во введённой строке

 For I:=1 to Length(S) do

   if S[I] in ['1'..'9'] then

     Inc(A[ord(S[I])-ord('0')])

   else

     break;

 // максимальная длина палиндрома равна длине строки

 Cur:=1;

 Center:=-1;

 SetLength(Result,Length(S));

 // составляем палиндром. В начало вставляем половину всех цифр от мин. к макс.

 For I:=1 to 9 do begin

   // поиск минимального числа, которое можно вставить в центр

   if (A[I] mod 2=1) and (Center<0) then

     Center:=I;

   // вставляем в начало строки половину символов

   Fino:=A[I] div 2;

   For J:=1 to Fino do

     Result[IncPost(Cur)]:=chr(I+ord('0'));

   // оставшуюся половину вставим потом

   A[I]:=Fino;

 end;

 // вставляем центральный символ

 if Center>0 then

   Result[IncPost(Cur)]:=chr(Center+ord('0'));

 // вставляем в обратном порядке символы палиндрома

 For I:=9 downto 1 do begin

   For J:=1 to A[I] do

     Result[IncPost(Cur)]:=chr(I+ord('0'));

 end;

 // восстанавливаем длину строки

 SetLength(Result,Cur-1);

end;

 

procedure Test(const S:string);

var

 S1:string;

begin

 S1:=(S);

 Writeln('Orig=',S);

 Writeln('Pal =',S1);

 Writeln('Diff=',Length(S)-Length(S1));

 Writeln;

end;

 

begin

 Test('9998888776665432111');

 Readln;

end.

ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика