Va rog sa ma ajutati la problema din poza. Vreau si explicatii nu doar programul in sine.
Răspunsuri la întrebare
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!