Informatică, întrebare adresată de vladgutenco1, 9 ani în urmă

Problema in C sau C++

Se da un numar natural. Sa se afiseze cel mai apropiat numar prim față de n.
(programul va contine cel putin un subprogram)

exemplu: n=24 se va afisa 23, pentru n=26 se va afisa 29.

Răspunsuri la întrebare

Răspuns de NuPotSaStiuTot
3

#include <iostream>
using namespace std;
bool isPrim(int);
int main(){
int n=26;
int r=0;
for (int i=1; i<n && r==0; i++){
if (isPrim(n+i)) r=n+i;
else if (isPrim(n-i)) r=n-i;
}
cout << r;
return 0;
}
bool isPrim(int n){
if (n/2*2==n) return false;
if (n/3*3==n) return false;
int i=5; int in=2;
while (i<n){
if (n/i*i==n) return false;
i=i+in;
if (in==2) in=4; else in=2; // 5 7 11 13 17 19 23 25 etc.
}
return true;
}

Razzvy: Imi place metoda ta de a verifica numerele prime. E mai rapida. Puteai sa faci sa creasca din 6 in 6, dar trebuia sa pui mai multe conditii.
NuPotSaStiuTot: cu 6? Am stiut mereu ca se merge cu 2, 4, 2,4, 2, 4, etc. Cum se arata programul cu 6?
Razzvy: while(i<n){if(n % i == 0 || n % (i + 2) == 0) return false; i += 6;}
Razzvy: Pentru ca restul, i+1, i+3, i+4, i+5 sunt divizibile cu 2 sau 3.
NuPotSaStiuTot: facut proba: zice ca 7 nu este prim!
Razzvy: while (i * i <= n)
Razzvy: Pentru ca nu mai exista divizori inte sqrt(n) si n (exclusiv)
NuPotSaStiuTot: Mai bine......................... si muuuuuuuuuuuuuuult mai repede
rossetta: Exista divizori intre radical(n) si n. Iti dau un exemplu: n = 21, radical din 21 este ~4 iar divizorii sunt 1, 3, 7 și 21. In schimb, nu exista divizori intre n/2 si n. Pe de alta parte, daca un n nu are divizori proprii mai mici ca radical(n) nu va avea nici divizori proprii mai mari ca radical(n), deoarece divizorii vin in perechi d1 * d2 = n. Pentru acest motiv, putem testa doar existena divizorilor <= radical(n).
Răspuns de Razzvy
2
#include <iostream>
#include <cmath>
using namespace std;

bool prim(int x)
{
   if (x % 2 == 0 && x != 2 || x < 2)
      return false;

   int sq = sqrt(x);
   for (int d = 3; d <= sq; d += 2)
      if (x % d == 0)
          return false;

   return true;
}

int main()
{
   int n, last, x;
   bool k;
  
   cin >> n;

   last = x = 2;
   while (!(k = prim(x)) || x < n)
   {
      if (k)
         last = x;
      x++;
   }

   if (n - last >= x - last)
      cout << last;
   else
      cout << x;
}

NuPotSaStiuTot: Error on if (k): k is uninitialised (MS vuìisual Studio)
NuPotSaStiuTot: in c++ x < n || !(k = prim(x)) executa x < n, si daca este true NU executa douale parte p=prim(x): k nu are valoare
Razzvy: Asa e, greseala mea.
NuPotSaStiuTot: De asemenea, am învățat si eu din această tema
Alte întrebări interesante