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

    Примеры
    Входные данные
    for i:=99921 downto 2
    Выходные данные
    29192

Ответы 7

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

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

      aubrie
    • 5 лет назад
    • 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<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:=MakeMinPalindromeMaxLength(S);

     Writeln('Orig=',S);

     Writeln('Pal =',S1);

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

     Writeln;

    end;

     

    begin

     Test('9998888776665432111');

     Readln;

    end.

    • Автор:

      reinaldo
    • 5 лет назад
    • 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 229192
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years