Rezolvare completă PbInfo #2230 palindrom3

Gigel a învăţat la şcoală un nou cuvânt: palindrom. El ştie acum că un palindrom este o construcţie formată din litere sau/şi cifre care arată la fel citită de la început spre sfârşit sau citită de la sfârşit spre început. De exemplu numerele 2552 și 12321 au proprietatea de palindrom. Deoarece lui Gigel îi place să se joace cu cifrele, el îşi pune următoarea problemă: dat fiind un număr natural, pot fi rearanjate cifrele lui astfel încât să obţinem un palindrom? Dacă da, care este numărul maxim palindrom care poate fi obţinut?

Cerința

Fiind dat un număr natural n să se determine cel mai mare număr palindrom care se poate obţine cu cifrele numărului n.

Date de intrare

Fișierul de intrare palindrom3.in conţine pe prima linie numărul natural n.

Date de ieșire

Fișierul de ieșire palindrom3.out conţine pe prima linie cel mai mare număr palindrom care se poate obţine cu cifrele numărului n.

Restricții și precizări

  • 0 < n < 2 147 483 648
  • Pentru datele de test există întotdeauna soluţie

Exemplu

palindrom3.in

3121321

palindrom3.out

3211123

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema palindrom3:

#include <bits/stdc++.h>
using namespace std;

ifstream f("palindrom3.in");
ofstream g("palindrom3.out");

int Cifre[10], n;

void Citire()
{
  f >> n;
  f.close();
}

void Descompune()
{         ///contorizez numarul de aparitii a cifrelor in vectorul Cifre[]
    do                          ///fac cu REPEAT
    {
        Cifre[n % 10]++;         ///ca sa prind si cazul n=0
        n /= 10;
    }
    while(n);
}

int Se_Poate()
{
    int Cate_Impare, i, x;
                ///verific numarul de aparitii a cifrelor
    x = 1;        ///maxim una poate sa apara de un numar impar de ori
    Cate_Impare = 0;
    for (i = 0; i < 10; i++)
        if (Cifre[i] % 2) Cate_Impare++;
    if (Cate_Impare > 1) x = 0;
    return x;
}

int Exista_Alte_Pare()
{
    int i, x;
    x =0;
    for (i = 1; i < 10; i++)
        if (Cifre[i] && (Cifre[i] % 2 == 0))
            x = 1;
    return x;
}

void Afiseaza()
{
    int i, j, Care_Este_Impar;

    Care_Este_Impar = -1;          ///nu are impare
    for (i = 0; i<10; i++)
        if (Cifre[i] % 2)
            Care_Este_Impar = i;        ///acesta este in numar impar
    if ((Care_Este_Impar >= 0) &&   ///daca am impar si
     (Cifre[0] % 2 == 0) &&     ///acesta nu este 0 si
     (Cifre[Care_Este_Impar] == 1) &&  ///apare o data si
     (Exista_Alte_Pare() == 0))           ///nu exista alte cifre decat cifra 0
        g << "-1\n";              ///nu se poate - este de tipul ... 400
    else
    {
        for (i = 9; i >= 0; i--)     ///afisez descrescator jumatate din ele
            for (j = 1; j <= Cifre[i] / 2; j++)
                g<<i;
        if (Care_Este_Impar >= 0)  ///afisez cel care apare de impar ori
            g << Care_Este_Impar;
        for (i = 0; i < 10; i++)       ///afisez crescator cealalta jumatate
            for (j = 1; j <= Cifre[i] / 2; j++)
                g << i;
        g << "\n";
    }
}

int main()
{
    Citire();
    if (n < 10) g<<n<<endl;   ///caz particular, orice numar dintr-o cifra este palindrom
    else
    {
        Descompune();
        if (Se_Poate()) Afiseaza();
        else g << "-1\n";
    }
    g.close();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2230 palindrom3

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2230 palindrom3 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!