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

(pbinfo #666) Functia care verifica daca un numar n este prim, este buna. Totusi nu imi actualizeaza contorul. Puteti sa ma ajutati?


#include

#include


using namespace std;


int prim(long long n)

{

long long d, ok=0;

for(d=2;d<=sqrt(n);d++)

{

if(n%d==0)

{

ok=1;

break;

}

}

if(ok==0 && n>1)

return 1;

return 0;

}


int main()

{

long long a[105][105], i, j, c=0, n, m;

cin>>n>>m;

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

{

for(j=1; j<=m; j++)

{

cin>>a[i][j];

}

}

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

{

for(j=1; j<=m; j++)

{

if(i%2==0 && prim(a[i][j]==1))

{

c++;

}

}

}

cout<

}


Cerința

Se dă o matrice cu n linii și m coloane și elemente numere naturale. Să se determine câte dintre elementele situate pe linii cu indici pari sunt prime.


Date de intrare

Programul citește de la tastatură numerele n m, iar apoi n șiruri cu câte m numere naturale, reprezentând elementele matricei.


Date de ieșire

Programul va afișa pe ecran numărul C, reprezentând valoarea căutată.


Restricții și precizări

1 ≤ n , m ≤ 100

elementele matricei sunt numere naturale mai mici decât 1.000.000

liniile matricei sunt numerotate de 1 la n, iar coloanele de la 1 la m.

Pentru cod mai clar:

Anexe:

Răspunsuri la întrebare

Răspuns de boiustef
2

Ai pierdit o paranteza la acest if

if(i%2==0 && prim(a[i][j]==1)), mă refer la verificarea primalitatii

Eu iti propun o altă structură să scoţi acest if din forul lui j, deoarece verifici si pentru linii impare pentru fiecare element din linie... nu e raţional

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

   {

     if(i%2==0)

       for(j=1; j<=m; j++)

       {

           if (prim(a[i][j])==1)

           {

               c++;

           }

       }

   }


Miercuri2002: Mersi! Nu stiam pentru un moment cum sa verific doar liniile, lol. M-am mai uitat de cateva ori peste cod, sigur este de la vreo paranteza? Nu vad sa lipseasca.
boiustef: în faţa celor două egaluri tr să fie ănchisă o paranteză
boiustef: rotundă
Miercuri2002: Acum m-am mai uitat peste program si am vazut care era faza cu paranteza. Mersi! :)
boiustef: :)))
boiustef: vezi pmarian a propus o idee mai simpatică de percurgere a liniilor pare, i începe de la 2 ş creşte din 2 în 2
for (i=2; i<=n; i+=2)

for (j=1; j<=m; ++j)

if (prim(a[i][j])) ++c;

cout << c << endl;
Răspuns de pmarian98
1

#include <iostream>

using namespace std;

int a[100][100];

int prim(int m)

{

   int p=1;

   if (m<2) p=0;

   else if (m==2) p=1;

        else

        {

            if (m%2==0) p=0;

            else

            {

                for (int k=3; k*k<=m && p; ++k)

                   if (m%k==0) p=0;

            }

        }

   return p;

}

int main()

{

   int n, m, i, j, c=0;

   cin >> n >> m;

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

       for (j=1; j<=m; ++j)

           cin >> a[i][j];

     for (i=2; i<=n; i+=2)

       for (j=1; j<=m; ++j)

           if (prim(a[i][j])) ++c;

   cout << c << endl;

   return 0;

}


boiustef: functia prim se mai poate eficientiza... mă refer la for
Alte întrebări interesante