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:
#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)