# PBinfo #3291 – Memory010 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Se citesc numere naturale cuprinse între 1 și 30.000.000 până la întâlnirea numărului 0. Să se afișeze valoarea duplicat.

Date de intrare
Programul citește de la tastatură maxim 1.000.000 de numere cuprinse între 1 și 30.000.000.

Date de ieșire
Programul va afișa pe ecran numărul d, reprezentând valoarea duplicată.

Restricții și precizări

între numerele citite se află cu siguranță un număr duplicat

Exemplu:
Intrare

12 3 8 10 5 8 2 0
Ieșire

8
Explicație
Valoarea 8 apare de doua ori.

## Cod sursă C++

```cpp
#include <iostream>
using namespace std;
unsigned int v[940000]; /// suficienti biti pentru a reprezenta orice valoare intre 0 si 30 mil
unsigned int duplicat;
int adauga (unsigned int x)
{
    int poz1 = x/32;  /// al catelea element din vectorul v va contine bitul cu numarul x
    int poz2 = x%32;  /// al catelea bit din v[poz1] este bitul al x-ulea
    unsigned int i=1;
    if (v[poz1] & (i<<poz2)) return 0;
    v[poz1] |= (i<<poz2);
    return 1;
}
int main()
{
    bool gasit=false;
    while(!gasit)
    {
        int x;
        cin >> x;
        if (!adauga(x))
        {
            duplicat=x;
            gasit=true;
        }
    }
    cout << duplicat;
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3291)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3291/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3291/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
