Am o problema in C++: numere distincte din N numere

Salutare tuturor. Astazi am inceput sa fac un set de probleme si am descoperit o problema care nu imi iese de loc, chiar daca la inceput mi s-a parut simpla in comparatie cu altele. Problema suna cam asa: Se dau n numere. Sa se creeze un vector ce contine doar numere distincte din cele n numere.
Am incercat sa o rezolv prin mai multe variante, cu dublu for si cu vectori de frecventa, dar tot nu mi-a iesit. Probabil am uitat sa fac ceva sau nu am fost atent la o idee, dar acum nu imi dau seama si sunt foarte curios sa vad care ar fi rezolvarea.
Daca stiti sa o rezolvati, va rog sa postati rezolvarea in limbajul C++. Multumesc mult si o seara placuta!

Eu zic să pui și variantele încercate de tine, să vedem unde te-ai blocat.

#include <iostream>
using namespace std;

int main() {
int v[100],c[100],a[100],n,i,j,k=0,l=1;
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(v[i]!=v[j])
{k++;
c[k]=v[i];
l=k;}
for(k=1;k<l;k++)
cout<<c[k]<<" ";
}

Stiu ca nu e bine, dar nu stiu ce sa modific. Cu vectori de frecventa ar merge daca ar trebui sa afisez de cate ori apare fiecare numar, nu sa afisez numarul.
Ar mai fi o varianta prin care adaug primul numar in vector, si dupa fiecare element din cele n-1 le verific daca sunt egale sau nu cu elementele din noul vector creat, daca un element nu e egal cu elementele deja existente in vector il adaug, doar ca asa nu pot sa pun conditia la for deoarece nu stiu cate elemente are vectorul.

Nu stiu exact care sunt cerintele, asta ar fi o varianta:

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    string str;
    cout << "Dupa ce ai terminat de bagat numerele, baga 'exit'" << endl;

    vector<int> rezultat;

    for(;;)
    {
        cin >> str;

        if(str == "exit")
            break;

        int nr_nou = stoi(str);

        // vezi daca nu cumva numarul exista deja in vector
        bool nr_deja_exista = false;
        for(int nr_gasit : rezultat)
        {
            if(nr_gasit == nr_nou)
            {
                nr_deja_exista = true;
                break;
            }
        }

        // numarul nu exista inca
        if(!nr_deja_exista)
            rezultat.push_back(nr_nou);
    }

    cout << "Acestea sunt numerele introduse:" << endl;
    for(int nr : rezultat)
    {
        cout << nr << " ";
    }
    cout << endl;

    return 0;
}

Daca e permis sa folosesti std::map e si mai simplu, in plus poti sa numeri si de cate ori a fost introdus un anumit numar.

Cam asa ar arata cu std::map

#include <string>
#include <map>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    string str;
    cout << "Dupa ce ai terminat de bagat numerele, baga 'exit'" << endl;

    map<int,int> rezultat;

    for(;;)
    {
        cin >> str;

        if(str == "exit")
            break;

        int nr_nou = stoi(str);

        auto it = rezultat.find(nr_nou);

        if(it != rezultat.end())
            // nr deja exista, incrementeaza contorul
            it->second++;
        else
            // numarul inca nu exista, adauga-l
            rezultat[nr_nou] = 1;

    }

    cout << "Acestea sunt numerele introduse:" << endl;
    for(const auto &nr : rezultat)
    {
        cout << nr.first << " [" << nr.second << "]" << endl;
    }

    return 0;
}
1 Like

Mersi foarte mult de solutie. Noi inca nu am invatat de astea, doar ce am studiat vectorii si am facut probleme simple cu ei.
Eu caut o solutie fara std::map si fara partea cu string. Oricum, mersi mult, prima solutie care merge :slight_smile: Daca stie careva o solutie fara chestiile astea va rog sa o postati.

Pai si de unde o sa stie programul cand sa se opreasca sa mai ceara numere?

Uite o varianta ca se opreste dupa ce ai introduse “n” numere unice:

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    cout << "Cate numere unice o sa fie?" << endl;

    int n;
    cin >> n;

    cout << "Trebuie sa bagi " << n << " numere unice. Start!" << endl;

    // se creaza un vector de dimensiune potrivita
    int vector[n];

    for(int i = 0; i < n;)
    {
        int nr;
        cin >> nr;

        // verificam daca numarul introdus exista deja in vector
        bool nr_deja_exista = false;
        for(int j = 0; j < i; j++)
            if(nr == vector[j])
            {
                nr_deja_exista = true;
                break;
            }

        // numarul nu exista, il adaugam in vector
        if(!nr_deja_exista)
        {
            vector[i] = nr;

            // incrementam "i"
            i++;
        }
    }

    cout << "Ai introdus urmatoarele numere unice: ";

    for(int i = 0; i < n; i++)
        cout << vector[i] << " ";

    cout << endl;

    return 0;
}

Sper ca ai si inteles ce-i acolo, nu doar copiezi exemplul si sa duci asa la scoala cu el :slight_smile:

2 Likes

int main()
{
int n,i,j,k=0, distinct;
float v[100],c[100];
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];
for(i=1;i<=n;i++)
{
distinct=1;//pp ca nr de pe poz i e distinct fata de celelalte de pe pozitiile j
for(j=i+1;j<=n;j++)
if(v[i]==v[j])
distinct=0;
if(distinct)
{
k++;
c[k]=v[i];
}
}
for(i=1;i<=k;i++)
cout<<c[i]<<" ";
return 0;
}

pe vremea mea se citeau din fisiere text.
fie aveai valoarea lui n pe primul rand, fie le citeai pe toate :slight_smile:

#include <iostream>

int main() {
	int myVec[10], val;
	bool unique = true;
	std::cin >> myVec[0];
	for (int i = 1; i < 10; ++i) {
		int j;
		std::cin >> val;
		for (j = 0; j < 10; ++j) {
			unique = true;
			if (val == myVec[j]) {
				unique = false;
				break;

			}
		}

		if (unique == false) {
			i--;
		}
		if (unique == true) {
			myVec[i] = val;
		}
	}


	for (int i = 0; i < 10; i++) std::cout << myVec[i] << " ";
	return 0;
}

La finalul executiei programului o sa ai exact 10 valori distincte stocate. Daca cerinta era sa construiesti direct in memorie un array cu elemente distincte, asta este solutia.