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

Se consideră subprogramul divizori, cu patru parametri:
• n, prin care primete un număr natural (n∈[2,106]);
• x, y și z, prin care furnizează câte un divizor al lui n (0 x+y+z=n, sau valoarea 0, prin fiecare dintre aceștia, dacă n nu are astfel de divizori.
Scriei definiia completă a subprogramului.
Exemplu: pentru numărul n=24, în urma apelului, x=4, y=8 i z=12, iar pentru numărul
n=9, în urma apelului, x=0, y=0 i z=0.

Răspunsuri la întrebare

Răspuns de boiustef
1

Răspuns:

#include <iostream>

using namespace std;

int n, x, y, z;

void divizori(int n, int &x, int &y, int &z)

{

   int m=n, t;

   int v[1000], i, k=0, j;

   for (i=1; i*i<m; ++i)

   {

       if (m%i==0)

       {

           ++k; v[k]=i;

           ++k; v[k]=m/i;

       }

   }

   if (i*i==m) { ++k; v[k]=i; }

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

   {

       for (j=i+1; j<=k; ++j)

           if (v[i]>v[j]) swap(v[i],v[j]);

   }

   int gasit=0;

   for (i=1; i<k-1; ++i )

   {

       for (j=i+1; j<k; ++j)

       {

           t=m-v[i]-v[j];

           if (m%t==0 && t>v[j])

           {

               x=v[i]; y=v[j]; z=t;

               gasit=1; break;

           }

       }

       if (gasit) break;

   }

   if (!gasit)

   {

       x=0; y=0; z=0;

   }

}

int main()

{

   cout << "n= "; cin >> n;

   divizori(n,x,y,z);

   cout << x << " " << y << " " << z;

}

Explicație:

am înţeles că se caută un singur triplet de divizori...

am plasat toţi divizorii intr-un vector, l-am sortat crescător, am căutat tripletul (x,y,z)


simonacum: Salut. Iti super multumesc. Nu inteleg ceva. Unde face verificarea ca suma celor 3 sa fie egala cu n
boiustef: salut. Am două for-uri unul pt i, care vor fi vlorile lui x, altul pt j, care vor fi valorile lui y. ca să evit complexitatea n^3, nu am creat încă un for pt z, ci folosesc o variabilă ajutătoare t=m-i-j, pt. care verific dacă e divizor a lui m (m are valoarea lui n) şi e mai mare ca j, atunci am găsit tripletul
boiustef: t mai mare ca v[j]
Alte întrebări interesante