Informatică, întrebare adresată de OmuBacovian, 8 ani în urmă

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

Anexe:

boiustef: incă nimeni nu a răspuns... am o idee, văd acum cum o realizez

Răspunsuri la întrebare

Răspuns de boiustef
4

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!


OmuBacovian: Multumesc mult ! O sa ma uit maine peste raspuns ...
boiustef: :)) noapte bună
Alte întrebări interesante