Informatică, întrebare adresată de stefanalexia01, 8 ani în urmă

Cerinţa (pb 163 pe pbinfo)

Se dă un vector cu n elemente numere naturale. Să se șteargă din vector toate elementele care sunt numere prime.


Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spaţii, reprezentând elementele vectorul.


Date de ieşire

Programul afișează pe ecran, separate prin spații, elementele vectorului obținut prin ștergerea elementelor prime.


Restricţii şi precizări

0 < n ≤ 1000

elementele vectorului vor fi mai mici decât 230


Ce este gresit la algoritmul meu?? Imi da 80 de puncte din 100
#include

using namespace std;

int main()
{ int n, i, v[1000], d, k, j;
cin>>n;

for(i=0; i >v[i];

i=0;
while(i{
int nr=0;

for( d=2; d*d <= v[i]; d++)
{
if(v[i]%d==0)
nr++;
}
if((nr==0)&&(v[i]!=1))
{ k=i;
for(j=k+1; j v[j-1]=v[j];
n--;
}
else i++;

}
for(i=0; i cout<
return 0;
}


lucaciucandrei: ai pus un cod naspa... nu prea inteleg dar iti voi da solutia mea de 100 de puncte
lucaciucandrei: descompunerea in produs de factori primi este mai eficienta mai ales pe numere mari decat testul de primalitate
lucaciucandrei: testu if (d * d > cv) d = cv; face minuni ;)

Răspunsuri la întrebare

Răspuns de lucaciucandrei
4

COROANA

#include <iostream>

using namespace std;

int main() {

   int n, v[1001];

   cin >> n;

   for (int i = 1; i <= n; i++)

       cin >> v[i];

   for (int i = 1; i <= n; i++) {

       int cv = v[i], d = 2, k = 1;

       while (cv > 1) {

           int p = 1;

           while (cv % d == 0) {

               cv /= d;

               p++;

           }

           k *= p;

           d++;

           if (d * d > cv)

               d = cv;

           

       }

       if (k == 2) {

           for (int j = i + 1; j <= n; j++)

               v[j - 1] = v[j];

           n--;

           i--;

       }

   }

   for (int i = 1; i <= n; i++)

       cout << v[i] << " ";

   return 0;

}

Alte întrebări interesante