Informatică, întrebare adresată de davidalexandru9, 9 ani în urmă

am codul unei probleme care trebuie sa afiseze elementele care apar o singura data in vector in ordine crescatoare. Insa ceva nu merge bine.
#include<fstream>#include<iostream>using namespace std;ifstream fin("42.in");int n, m, i, a[100002], b[100002], j, stop, aux;int main(){    fin>>n;    m=0;    for(i=1;i<=n;i++)        fin>>a[i];    for(i=1;i<n;i++)    {        for(j=i+1;j<=n;j++)        {            if(a[i]==a[j])                stop=1;        }        if(stop==0) b[++m]=a[i];    }    for(i=1;i<m;i++)        for(j=i+1;j<=m;j++)    {        if(b[i]>b[j])        {            aux=b[i];            b[i]=b[j];            b[j]=aux;        }    }    for(i=1;i<=m;i++)        cout<<b[i]<<" ";    fin.close();    return 0;}


Razzvy: sa zicem ca ai sirul 2 2 3
Razzvy: Ia primul element si il compara cu cele din dreapta
Razzvy: gaseste ca al doilea e egal cu primul si nu-l pune in b
Razzvy: dupa aceea se duce la al doilea element si compara cu cele ramase in dreapta
Razzvy: si va compara 2 cu 3: nu sunt egale, deci poate fi pus in vectorul b(asta face programul tau)
Razzvy: si vectorul b o sa aiba 2 3
Razzvy: in loc sa aiba doar 3
Razzvy: mai trebuie sa faci ceva atunci cand gasesti 2 numere egale
Razzvy: poti sa spui a[j] = -1

Răspunsuri la întrebare

Răspuns de ap53
1
#include<fstream>#include<iostream>using namespace std;ifstream fin("ksir.in");int n, m, i, a[100002], b[100002], j, stop, aux;int main(){        fin>>n;        m=0;        for(i=1;i<=n;i++)            fin>>a[i];        for(i=1;i<n;i++)        {            stop=0; // 0 - daca nu se repeta            for(j=1;j<=n;j++)                if(a[i]==a[j]&&i!=j)                    stop=1; // 1 - cand se repeta            if(stop==0)                b[++m]=a[i];        }        for(i=1;i<m;i++)            for(j=i+1;j<=m;j++)            {                if(b[i]>b[j])                {                    aux=b[i];                    b[i]=b[j];                    b[j]=aux;                }            }        for(i=1;i<=m;i++)            cout<<b[i]<<" ";        fin.close();        return 0;}

ap53: Aveai doua erori: 1. Nu puneai stop=0 la fiecare iteratie. 2. j trebuie sa ia valori de la 1, nu de la i+1, pentru ca, daca, de exemplu, pentru n=10 sirul e 6 7 6 2 8 3 5 9 1 7, pentru a doua aparitie a lui 6 verifici doar restul sirului si apare ca si cum 6 ar aparea o singura data (desi el apare de 2 ori in sir). Verificarea se face pentru toti i diferiti de j. Oricum, acest algoritm nu e optim din punct de vvedere al timpului de executie.
Alte întrebări interesante