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

Să se scrie o funcție C++ care să determine suma divizorilor primi ai unui număr natural transmis ca parametru. Funcția întoarce rezultatul prin intermediul unui parametru de ieşire.
Restricţii şi precizări
numele funcției va fi sum_div_prim
funcția va avea doi parametri, reprezentând numărul pentru care se calculează suma divizorilor, respectiv valoarea calculată
numărul pentru care se calculează suma divizorilor primi va fi mai mare decât 1 și mai mic decât 2.000.000.000
Soluţia propusă va conţine doar definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.
Nu inteleg de ce iau 80p la aceasta problema
void sum_div_prim( int n,int &s)
{
int x = 2;
s = 0;
while ( n != 1 )
{
if ( n % x == 0 )
{
s = s + x;
while ( n % x == 0 )
n = n/x;
}
else
x++;
}
}
aceasta este rezolvarea mea.

Răspunsuri la întrebare

Răspuns de Razzvy
4
Ai solutia in atasament.
Anexe:

Razzvy: Probleama la programul tau era timpul
Razzvy: Tu trebuie sa verifici doar numerele prime
Razzvy: Desigur, ca nu ai cum sa stii care sunt cele prime
Razzvy: Dar poti sa reduci timpul la jumatate, luand doar numerele impare
Razzvy: Pentru ca singurul numar prim si par este 2
Razzvy: Iar pe acela il iei separat
Razzvy: Si mai stim ca nu exista divizori mai mari decat radical din n
Razzvy: in afara de numarul insusi
Razzvy: si atunci te opresti la radical din n
adelina122qmea: Multumesc!
Răspuns de express
4
void sum_div_prim(int n, int &s)
{
    int d, i, nr;
    if(n == 1) {s = 0; return;}
    bool prim = true;
    for(i = 2; i * i <= n; i ++)
      if(n % i == 0)
      {
          prim = false;
          break;
      }
    if(prim)
    {
        s = n;
        return;
    }
    else
    {
      s = 0;
      for(d = 2; d * d < n; d ++)
       if(n % d == 0)
        {
           prim = true;
           for(i = 2; i * i <= d; i ++)
            if(d % i == 0)
            {
              prim = false;
              break;
            }
            if(prim) s = s + d;
           prim = true;
           nr = n / d;
           for(i = 2; i * i <= nr; i ++)
            if(nr% i == 0)
            {
              prim = false;
              break;
            }
            if(prim) s = s + nr;
       }
       if(d * d == n)
       {
            prim = true;
            for(i = 2; i * i <= d; i ++)
            if(d % i == 0)
            {
              prim = false;
              break;
            }
            if(prim) s = s + d;
       }
    }
       return;
}

Alte întrebări interesante