Напишите, пожалуйста, программу, которая составляет из цифр введённой строки...

0 голосов
115 просмотров

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


Информатика (15 баллов) | 115 просмотров
Дано ответов: 2
0 голосов
Правильный ответ

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 2

29192

(654k баллов)
0 голосов

program RawTcherv;

 

function IncPost(var I:integer):integer;

begin

 Result:=I;

 Inc(I);

end;

 

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

function MakeMinPalindromeMaxLength(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

     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:=MakeMinPalindromeMaxLength(S);

 Writeln('Orig=',S);

 Writeln('Pal =',S1);

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

 Writeln;

end;

 

begin

 Test('9998888776665432111');

 Readln;

end.

(78 баллов)
0

Повеситься можно....

0

Ага

0

Но мы так делалиъ

0

Я напишу покороче)))

0

У Вас, я так понимаю, процедура для Delphi написана, раз FillChar(A{%H-},sizeof(A),0); указано? Вы бы хоть намекнули где-то...

0

А еще, может я чего не понял, но для приведенного примера со строкой for i:=99921 downto 2 Ваша программа не возвращает ничего.