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

Cerinţa
Să se scrie un program care citeşte un număr natural n şi determină factorul care apare în descompunerea în factori primi a lui n la puterea cea mai mare.

Date de intrare
Programul citește de la tastatură numărul n.

Date de ieşire
Programul afișează pe ecran numărul prim p, cu semnificaţia precizată.

Restricţii şi precizări
1 < n < 2.100.000.000
dacă în descompunerea în factori primi a lui n apar mai mulţi factori la puterea maximă, se va afişa cel mai mare dintre ei



Exemplu
Intrare

405
Ieșire

3
Explicație
405 = 3 4 * 5 1 . Astfel, factorul care apare la puterea cea mai mare este 3


uleiaalex: Data viitoare sa pui mai putine puncte deoarece e prea ez problema pentru atatea puncte. Multumesc :-*
MadalinaMadutaa: Bine!

Răspunsuri la întrebare

Răspuns de Razzvy
3
#include <iostream>
#include <cmath>

int main()
{
   int n, p_max, e_max = 0, sq;
  
   cin>>n;
   //Facem descompunerea cu 2 separat deoarece e singurul nr prim par
   if(n % 2== 0)
   {
       int e = 0;
       while(n % 2 == 0)
       {
           n /= 2;
           e++;
       }
       p_max = 2;
       e_max = e;
   }

   sq = sqrt(n);
   //Cum singurul numar prim par este 2, vom verifica numai numerele impare (i += 2)
   for(int d = 3; d <= sq; d += 2)
   {
       if(n % d == 0)
       {
           int e = 0;
           while(n % d == 0)
           {
               n /= d;
               e++;
           }
           if(e >= e_max)
           {
               e = e_max;
               p_max = d;
           }
           sq = sqrt(n);
       }
       cout<<p_max;
   }

//Prin functii
#include <iostream>
#include <cmath>

int descompunere(int & x, int d) /*Descompune numarul x dupa numarul prim d si     returneaza  exponentul lui d*/
{
   int e = 0;
   while(x % d == 0)
   {
       n /= d;
       e++;
   }
   return e;
}

int main()
{
   int n, p_max, e_max = 0, sq, e;
  
   cin>>n;
   e = descompunere(n, 2);
   if(e)
   {
      p_max = 2;
      e_max = e;
   }  

   sq = sqrt(n);
   //Cum singurul numar prim par este 2, vom verifica numai numerele impare (i += 2)
   for(int d = 3; d <= sq; d += 2)
   {
       e = descompunere(n, d);
       if(e)
       {
           if(e >= e_max)
           {
               e = e_max;
               p_max = d;
           }
           sq = sqrt(n);
       }
       cout<<p_max;
   }


MadalinaMadutaa: as vrea si prin functie
Razzvy: ok
MadalinaMadutaa: Mersi!
Răspuns de uleiaalex
2
Am facut in pascal, doar cateva linii de cod si gata problema :D. Am facut cu functie.

Problema si in C++

#invclude <iostream>
using namespace std;
int BigFactPrimi(int x);
{
     int max=0;
     for (int i:=2;i<=n div 2;i++)
     {
          nr=0;
          while (x % i = 0)
          {
               nr++;
               x:=x div i;
          }
          if (nr>max)
          {
               varnum=i;
               max=nr;
          }
        }
return varnum;
}
int main()
{
     int n;
     cin>>n;
     cout<<BigFactPrimi(n);
     return 0;
}
Anexe:

MadalinaMadutaa: n am invatat pascal
MadalinaMadutaa: trebuia in c++
uleiaalex: Imi pare rau, dar ce a facut baiatul de mai sus e prea complicat s-a invartit in jurul cozii, as putea sa traduc daca e
Razzvy: Am sacrificat cantitatea de cod in schimbul timpului de excecutie. Algoritmul acesta are complexitate O(n / 2), dar o soultie mai buna este O(sqrt(n)/2)
uleiaalex: am refacut in C++ UP
uleiaalex: Da se poate si mai optimizat dar probabil nu necesita. Ori cum iti apreciez efortul si un UP si pentru tine:D Thumb up dude :D
Alte întrebări interesante