👤

Va rog sa ma ajutati la problema din poza. Vreau si explicatii nu doar programul in sine.

Va Rog Sa Ma Ajutati La Problema Din Poza Vreau Si Explicatii Nu Doar Programul In Sine class=

Răspuns :

Răspuns:

#include <iostream>

#include <fstream>

using namespace std;

ifstream f("numar.txt");

int n, i, A[10], gasit=1, j;

int exmaimare(int m)

{

   int e, k, minim, ind;

   if (m==9) e=0;

   else

   {

       k=m+1;

       while (k<10 && A[k]<A[m]) ++k;

       if (k==10) e=0;

       else

       {

           minim=A[k]; ind=k;

       }

       for (int t=k+1; t<10; ++t)

       {

           if (A[t]>A[m] && A[t]<minim)

           {

               minim=A[t]; ind=t;

           }

       }

       cout << minim << " " << ind << "\n";

   }

   if (e==0) return 0;

   else return ind;

}

void ordcresc(int m)

{

   for (int i=m; i<9; ++i)

   {

       for (int j=i+1; j<10; ++j)

       if (A[j]<A[i]) swap(A[i],A[j]);

   }

}

int main()

{

   f >> n;

   for (i=1; i<10; ++i)

   {

       A[10-i]=n%10; n/=10;

   }

   i=2;

   while (A[i]>A[i-1] && i<10) ++i;

   if (i==10) swap(A[1],A[2]);

   else

   {

       j=exmaimare(i);

       if (j!=0)

       {

           cout << i << " " << j << "\n";

           swap(A[i],A[j]);

           cout << A[i] << "\n";

           ordcresc(i+1);

       }

       else

       {

           if (i==2) gasit=0;

           else

           {

               swap(A[i-1],A[i-2]);

               ordcresc(i-1);

           }

       }

   }

   if (gasit==0) cout << "nu exista";

   else

   {

       for (i=1; i<10; ++i)

           cout << A[i];

   }

}

Explicație:

parcă lucrează... :)))

ideea este următoarea:

- căutăm prima poziţie i, unde unde A[i] nu este mai mare ca precedentul.

- dacă nu am gasit aşa poziţie, adică am ajuns cu i la 10, atunci cifrele sunt strict crescătoare (cazul 123456789) atunci interschimbăm primele două cifre;

- altfel căutăm dacă există o cifră minimă dintre cele rămase, dar mai mare ca A[i]. Din apelul funcţiei exmaimare revenim cu indicele acestei cifre mai mari ca A[i], dar minimă din cele rămase, dacă a fost găsită aşa cifră, altfel revenim din funcţie cu 0. Dacă există atunci interschimbăm elementele şi pe cele din dreapta lui A[i] le ordonăm crescător.

- dacă nu există mai mare ca A[i] în dreapta lui, şi i=2, atunci nu gasim numarul cautat, altfel (pt, i>2) interschimbăm două precedente lui A[i] şi ordonăm crescător -

... pare complicat, dar dacă conştientizezi algoritmul, atunci pare simplu... Trebuie să exersezi pe hârtie... Succese!