Nu vreau rezolvarea propriu-zisa, doar o explicatie.
O metoda eficienta este sa ordonez numerele, pe masura ce le citesc si sa le pun intr-un vector, apoi sa mai parcurg vectorul sa vad daca sunt ordinate?
Sau cu vector de frecventa?
Răspunsuri la întrebare
Răspuns:
aici postez o variantă cu cod foarte scurt, rapid, dar care foloseşte mai mult spatiu. Numerele citite din fişier le plasăm într-o matrice cu 10 linii. Găsim ultima cifră a numărului citit şi plasăm numărul în linia corespunzătoare ultimei cifre. Poziţiile plasării le memorăm într+un vector poz[10], care se actualizează după fiecare plasare a unui număr.
#include <iostream>
#include <fstream>
using namespace std;
short n,i,j,num, u, mat[10][10000],poz[10];
ifstream fin("date.txt");
int main()
{
fin >> n;
for (i=0; i<n; ++i)
{
fin >> num;
u=num%10;
mat[u][poz[u]++]=num;
}
for (i=0; i<10; i++)
{
for (j=0; j<poz[i]; j++)
cout << mat[i][j] << " ";
}
}
Explicație:
A doua variantă este cu vector de liste simplu înlănţuite (vezi mai sus în comentarii explicaţiile) Foloseşte mai puţin spaţiu, dar e un cod mai voluminos...
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("date.txt");
struct Nod{
int val;
Nod* next;
};
void push(Nod *& vf, int num){
Nod* nou=new Nod;
nou->val=num;
nou->next=vf;
vf=nou;
}
void afisare(Nod *vf)
{
Nod *p=vf;
while (p!=NULL)
{
cout << p->val << " ";
p=p->next;
}
}
int n,i,num,u;
Nod *c[10];
int main()
{
for (i=0; i<10; i++)
c[i]=NULL;
fin >> n;
for (i=0; i<n; ++i)
{
fin >> num;
u=num%10;
if (c[u]!=NULL) push(c[u],num);
else
{
c[u]=new Nod;
c[u]->val=num;
c[u]->next=NULL;
}
}
for (i=0; i<10; ++i)
{
if (c[i]!=NULL)
afisare(c[i]);
}
}