Rezolvare completă PbInfo #742 Numar2

Cerința

Fie un număr natural a având n cifre. Scrieţi un program care să determine un număr natural x cu proprietatea că este cel mai mic număr mai mare decât a, care are exact aceleaşi cifre ca şi numărul a.

Date de intrare

Fișierul de intrare numar2.in conține două linii:

  • pe prima linie un număr natural reprezentând valoarea lui n;
  • pe a doua linie, fără spaţii între ele, n cifre reprezentând numărul a.

Date de ieșire

Fișierul de ieșire numar2.out va conține o singură linie pe care se va afla numărul x.

Restricții și precizări

  • 1 ≤ n ≤ 5.000.000;
  • pentru 50% dintre teste, n ≤ 1.000.000;
  • pentru toate datele de test există soluţie.

Exemplu

numar2.in

6
204924

numar2.out

204942

Explicație

Există mai multe numere formate din exact aceleaşi cifre ca şi numărul 204924 mai mari decât el. Dintre acestea, 204942 este cel mai mic.

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 Numar2:

var f,g:text;
    n,i,j,k:longint;
    c:array[0..9] of longint;
    poz:longint;
    cif,a,b:byte;
    buf:char;

begin
 assign(f,'numar2.in'); reset(f);
 assign(g,'numar2.out'); rewrite(g);
 readln(f,n);
 poz := 0;
 read(f,buf);
 a := ord(buf) - 48;
 inc(c[a]);
 for i := 2 to n do
  begin
   read(f,buf);
   b := ord(buf) - 48;
   if a>=b then inc(c[b])
   else
    begin
      poz := i-1;
      for j := 0 to 9 do c[j]:=0;
      inc(c[b]);
      cif := a;
    end;
   a := b;
  end;
 reset(f);
 readln(f,n);
 for i := 1 to poz-1 do
  begin
   read(f,buf);
   write(g,buf)
  end;
 for j := cif+1 to 9 do
   if c[j]<>0 then
     begin
      write(g,j);
      dec(c[j]);
      break
     end;
 inc(c[cif]);
 for j := 0 to 9 do
   for k := 1 to c[j] do
     write(g,j);
 writeln(g);
 close(g);
end.

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 #742 Numar2

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #742 Numar2 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!