Напишите, пожалуйста, программку, которая составляет из цифр введённой строчки число-палиндром
Напишите, пожалуйста, программку, которая сочиняет из цифр введённой строки число-палиндром наибольшей длины (которое читается одинаково слева вправо и справа влево). Если таких чисел несколько, необходимо вывести малое из их. Все имеющиеся числа использовать не обязательно, но количество цифр в ответе обязано быть очень возможным. Язык программирования Паскаль
Входная строчка содержит числа (по последней мере, одну) и, вероятно, иные знаки.
Программка обязана вывести число-палиндром наибольшей длины, которое можно составить из цифр входной строчки.
Образцы
Входные данные
for i:=99921 downto 2
Выходные данные
29192
PascalABC.NET 3.4.2, сборка 1864 от 11.11.2018
Внимание! Если программка не работает, обновите версию!
begin
var s := ReadlnString;
var s1 := s.Where(t -gt; t in ['0'..'9']).Sorted.GroupBy(t -gt; t)
.Select(c -gt; (c.Key, c.Count)).OrderBy(t -gt; t[0]).ToArray;
var s2 := s1.Where(t -gt; t[1] gt; 1).Select(t -gt; t[0] * (t[1] div 2))
.JoinIntoString('').Replace('0', '');
var s3 := s1.Where(t -gt; t[1] = 1);
if s3.Count gt; 0 then s2 := s2 + s3.Select(t -gt; t[0]).First + s2.Inverse
else s2 := s2 + s2.Inverse;
s2.Println
end.
Пример
for i:=99921 downto 2
29192
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 (Centerlt;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 Centergt;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.
-
Вопросы ответы
Статьи
Информатика
Статьи
Разные вопросы.
Разные вопросы.
Математика.
Русский язык.
Русский язык.
Разные вопросы.
Қазақ тiлi.
Английский язык.
Математика.
История.