Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- ifstream f("atestat.in");
- ofstream g("atestat.out");
- const int NMAX = 100001;
- int V[NMAX], N, nrMax;
- bool isPrime(int x){
- if(x == 2) return true;
- if(x%2==0) return false;
- for(int i = 3; i <= sqrt(x); i+=2){
- if(x%i==0) return false;
- }
- return true;
- }
- int vizitat1[NMAX], vizitat2[NMAX], vizitatNr[NMAX];
- bool contineCifreVector(int x){
- int vectorCifre[NMAX], nrCifre = 0, save = x, Vfaradubluri[NMAX], Cifrefaradubluri[NMAX];
- for(int i = 0; i < NMAX; ++i) vizitat1[i] = 0; // golesc vectorii de frecventa dupa fiecare numar(sunt declarati global, trebuie goliti)
- for(int i = 0; i < NMAX; ++i) vizitat2[i] = 0; // golesc vectorii de frecventa dupa fiecare numar(sunt declarati global, trebuie goliti)
- while(x){
- vectorCifre[nrCifre] = x%10;
- x/=10;
- nrCifre++;
- } // scot toate cifrele din numar
- sort(vectorCifre, vectorCifre+nrCifre); // sortez vectorul de cifre
- int contor1 = 0, contor2 = 0;
- for(int i = 0; i < nrCifre; ++i){
- if(vizitat1[vectorCifre[i]] == 0){
- Cifrefaradubluri[contor1] = vectorCifre[i];
- contor1++;
- vizitat1[vectorCifre[i]] = 1;
- }
- else vizitat1[vectorCifre[i]]++;
- } // creez vector fara dubluri pentru numarul x
- for(int i = 0; i < N; ++i){
- if(vizitat2[V[i]] == 0){
- Vfaradubluri[contor2] = V[i];
- contor2++;
- vizitat2[V[i]] = 1;
- }
- else vizitat2[V[i]]++;
- } // elimin dublurile din vectorul V
- // int dif = abs(contor1-contor2);
- int q = 0;
- for(int i = 0; i < contor1; ++i){
- for(int j = 0; j < contor2; ++j){
- if(Cifrefaradubluri[i] != Vfaradubluri[j]) q++; // compar cifra cu cifra din vectorii construiti mai sus
- }
- if(q >= contor2) return false; // conditia sa verific daca numarul are cifre doar din vectorul V
- q = 0;
- }
- return true;
- }
- int main()
- {
- f >> N;
- for(int i = 0; i < N; ++i) f >> V[i];
- sort(V, V+N);
- for(int i = N; i >= 0; --i) nrMax = nrMax * 10 + V[i];
- g << nrMax << "\n";
- // cout << isPrime(12) << " " << isPrime(11); DEBUG pentru functia de prim
- // cout << contineCifreVector(225) << contineCifreVector(111); DEBUG pentru functia cu numerele
- for(int i = 1; i < pow(10, N-1); ++i){
- if(isPrime(i) == true && contineCifreVector(i) == true){
- int saved = i;
- for(int l = 0; l < NMAX; ++l) vizitatNr[l] = 0; // golesc memoria din vectorul de frecventa
- while(saved){
- vizitatNr[saved%10]++;
- saved/=10;
- }
- bool ok = true;
- for(int i = 0; i < NMAX; ++i){
- if(vizitatNr[i] > 0 && vizitat2[i] > 0){
- if(vizitatNr[i] > vizitat2[i]) ok = false; // verific sa se foloseasca fiecare cifra de un numar mai mic / egal cu aparitia sa in fisier
- }
- if(ok == false) break;
- }
- if(ok) g << i << " ";
- }
- }
- f.close();
- g.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement