Rezolvare completă PbInfo #2198 elimin_prime

Se consideră un șir de n numere întregi, cu n număr natural nenul. Se elimină primul element din șir și toate elementele șirului aflate pe poziții care reprezintă numere prime, în ordinea crescătoare a pozițiilor. Operația de eliminare se repetă cu elementele rămase în șir, repoziționate după eliminarea celorlalte, până când este eliminat și ultimul element rămas.

Cerința

Să se scrie un program care afișează elementele șirului inițial, în ordinea în care au fost eliminate conform algoritmului descris mai sus.

Date de intrare

Fișierul de intrare elimin_prime.in conține pe prima linie numărul n, iar pe a doua linie n numere întregi separate prin spații.

Date de ieșire

Fișierul de ieșire elimin_prime.out va conține pe prima linie, separate prin spațiu, numerele din fișierul de intrare în ordinea eliminării acestora.

Restricții și precizări

  • 1 ≤ n ≤ 100.000
  • numerele de pe a doua linie a fișierului de intrare sun cuprinse în intervalul [-1.000.000.000, 1.000.000.000]
  • elementele șirului sunt indexate de la 1 la n.

Exemplul 1:

elimin_prime.in

10
1 2 3 4 5 6 7 8 9 10

elimin_prime.out

1 2 3 5 7 4 6 8 10 9

Exemplul 2:

elimin_prime.in

20
4 23 16 -7 89 115 23 11 15 2 -8 -9 21 0 75 23 32 -1 4 5

elimin_prime.out

4 23 16 89 23 -8 21 32 4 -7 115 11 2 0 5 15 -9 75 -1 23

Atenție!

Programele vor folosi doar instrucțiunile de bază ale limbajului de programare ales, inclusiv cele de intrare/ieșire, dar nu și alte funcții din biblioteci specializate (algorithm, string,…).

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema elimin_prime:

# include <bits/stdc++.h>
# define NM 100005
using namespace std;

ifstream f("elimin_prime.in");
ofstream g("elimin_prime.out");

int n;
bool Prime[NM];
int a[NM], aux[NM];

void ciur( int n )
{
    Prime[0] = true;

    for (int i = 2; i <= n; ++i)
        if (Prime[i] == false)
            for (int j = 2; i*j <= n; ++j)
                Prime[i*j] = true;
}


int main()
{
    f >> n;
    for(int i=1; i <= n; ++i)
        f >> a[i];

    ciur (n);

    do {
            int k = 0;
            for(int i=1; i <= n; ++i)
                if ( !Prime[i] )
                    g << a[i] << " ";
                else {
                    ++k;
                    aux[k] = a[i];
                }

            n = k;
            for(int i=1; i <= n; ++i)
                a[i] = aux[i];

    }while ( n > 0);

    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2198 elimin_prime

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2198 elimin_prime de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!