# PBinfo #1145 – Extraprime – Rezolvare C++

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

## Enunț

Gigel, mare amator de probleme de matematică şi informatică, a observat că unele numere prime au o proprietate interesantă: orice cifră ar elimina dintr-un astfel de număr, numărul obţinut este tot număr prim. A numit astfel de numere numere extraprime. De exemplu, numărul 317 este un număr extraprim: el este număr prim şi, în plus, dacă eliminăm cifra 3, obţinem 17, care este prim; dacă eliminăm 1, obţinem 37, care este prim; dacă eliminăm 7, obţinem 31, care este şi el număr prim.

Cerință
Spunem că x este între a şi b dacă x≥a şi x≤b. Fiind date două valori naturale a şi b, să se determine câte numere extraprime există între a şi b, precum şi cel mai mic şi cel mai mare număr extraprim dintre a şi b.

Date de intrare
Fișierul de intrare extraprime.in conține pe prima linie cele două valori naturale a şi b, separate printr-un spaţiu.

Date de ieșire
Fișierul de ieșire extraprime.out va conține 3 linii. Pe prima linie se va scrie un număr natural nr reprezentând numărul de numere  extraprime dintre a şi b. Pe linia a doua a fişierului de ieşire se va scrie cel mai mic număr extraprim dintre a şi b, iar pe linia a treia a fişierului de ieşire se va scrie cel mai mare număr extraprim dintre a şi b.

Restricții și precizări

10 < a ≤ b < 10000000;
Numărul 1 nu este prim;
Pentru datele de test există întotdeauna soluţie;

Exemplu:
extraprime.in

10 100
extraprime.out

4
23
73
Explicație
Se află 4 numere extraprime mai mari decât 10 şi mai mici decât 100: 23, 37, 53 şi 73.

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
ifstream in("extraprime.in");
ofstream out("extraprime.out");
long long int contor = 0, maxim = -1000000000, minim = 1000000000;
bool ciur[10000005];
int a, b, cifre[10], nrcif;
void fciur() {
    ciur[1] = 1;
    for (int i = 4; i <= 10000000; i = i + 2) ciur[i] = 1;
    for (int i = 3; i * i <= 10000000; i = i + 2)
        if (!(ciur[i]))
            for (int j = i * i; j <= 10000000; j = j + 2 * i)
        		ciur[j] = 1;
}
int verif(int n) {
    nrcif = 0;
    if (ciur[n]) return false;
    while (n != 0) {
        cifre[++nrcif] = n % 10;
        n = n / 10;
    } for (int i = nrcif; i >= 1; i--) {
        int temp = 0;
        for (int j = nrcif; j >= 1; j--)
            if (i != j)
            	temp = temp * 10 + cifre[j];
        if (ciur[temp]) return false;
    } return true;
}
int main() {
    fciur();
    in >> a >> b;
    for (int i = a; i <= b; i++) {
        int temp = i;
        if (verif(temp)) {
            if (temp > maxim) maxim = temp;
            if (temp < minim) minim = temp;
        	contor++;
        }
    } out << contor << "\n" << minim << "\n" << maxim;
    return 0;
}
```

## Resurse

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