A elaborat: Gușan Veronica Semnătura: __________
PROIECT DE PROGRAME NR. 2. ORGANIZAREA CICLURILOR ÎN PROGRAM. FUNCŢII
I. Formularea problemei
Tema: Numere perfecte (amiabile)
De efectuat următoarele operaţii:
1. De verificat dacă numărul nr este perfect.
2. De indicat toate numerele din intervalul [a; b], care sunt perfecte.
3. De indicat primele n numere perfecte.
4. De indicat toate numerele amiabile din intervalul [a; b].
5. De determinat cel mai mare număr perfect.
II. Studiu preliminar
Un număr este perfect dacă este egal cu suma alicotă a divizorilor săi: ; exemplu: 6=1+2+3.
O pereche de numere amiabile constă din două numere între care există următoarea relaţie: suma
alicotă a divizorilor fiecăruia dintre ele este egală cu celălalt număr. Primele 7 perechi de numere amiabile:
[220,284], [1184,1210], [2620,2924], [5020,5564], [6232,6368], [10744,10856], [12285,14595].
III. Indicaţii metodice
1. Programul trebuie să fie universal, adică trebuie să se obţină rezultatul pentru orice date iniţiale.
VI. Programul
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#define MAXINT 2147483647
using namespace std;
bool Perfect(int a);
bool Amiabil(int m, int n);
int main()
{
int nr, nr2; //nr- numarul care trebuie verificat; nr2- variabila contor
int a, b; //a,b- limitele intervalului
int c; //variabila contor al numerelor perfecte din intervalul [a,b]
int n; //n- primele n numere perfecte
bool val; //variabila logica pentru iesirea din ciclul while
cout << "-------- Proiect Nr.2 elaborat de Gusan Veronica! --------\n" << endl;
cout << "Tema: Numere perfecte" << endl;
cout << "\nIntroduceti numarul care trebuie verificat: "; cin >> nr;
cout << " \nIntroduceti limitele intervalului: "; cin >> a; cin >> b;
//1. de verificat dacă numărul este perfect
cout << "\n\n1. Numarul " << nr;
if (!Perfect(nr)) cout << " nu";
cout << " este perfect. ";
//2. de indicat toate numerele din intervalul [a; b], care sunt perfecte
cout << " \n\n2. Numerele perfecte din intervalul ["<<a<<","<<b<<"] sunt: \n";
for(nr = a, c = 0; nr <= b; nr++)
if (Perfect(nr))
{
cout << nr << " \n";
c++;
1
}
cout << " \nIn total sunt " << c << " numere perfecte.";
//3. de indicat primele n numere perfecte
cout << " \n\nIntroduceti un numar natural (<=4): "; cin >> n;
cout << " \n\n3. Primele "<< n <<" numere perfecte sunt: \n";
for(nr = 1, c = 1; (c <= n) && (nr < MAXINT); nr++)
if (Perfect(nr))
{
cout << nr<<" \n";
c++;
}
//4. de indicat toate numerele amiabile din intervalul [a; b]
cout << " \n\n4. Perechile de numere amiabile din intervalul ["<<a<<","<<b<<"] sunt: \n";
for(nr = a, c = 0; nr <= b; nr++)
{
for(nr2 = nr + 1; nr2 <= b; nr2++)
if (Amiabil(nr, nr2))
{
cout << "(" << nr << ";" << nr2 << ")" << endl;
c++;
}
}
cout << " \nIn total sunt "<< c <<" perechi de numere prietene.";
//5. de determinat cel mai mare număr perfect
cout << " \n\n5. Cel mai mare numar perfect este: \n";
nr = MAXINT;
val = true;
while ((nr >= 1) && (val == true))
{
if (Perfect(nr))
{
cout << nr << " \n";
val = false;
}
nr --;
}
return 0;
}
// Funcții utilizate în program
int Suma_alicot(int a)
{
int s = 0;
for (int i = 1; i <= a/2; i++)
if (a % i == 0) s += i;
return s;
}
bool Perfect(int a)
{
return a == Suma_alicot(a);
}
bool Amiabil(int m, int n)
{
return (m == Suma_alicot(n)) && (n == Suma_alicot(m));
}
2
V. Rezultate
VI. Concluzie
Sunt cunoscute 5 numere perfecte. 4 dintre ele le poate genera programul fără probleme, însă la al 5-
lea timpul de procesare este extrem de mare, din care motiv nu am putut vedea afișat pe ecran următorul
număr perfect (33 550 336).