$$1$$ oraz $$\frac{28}{1}=28$$
$$2$$ oraz $$\frac{28}{2}=14$$
$$4$$ oraz $$\frac{28}{4}=7$$
Dalej nie szukamy, ponieważ dzielniki będą się powtarzały. Liczby, które musimy sprawdzić, czy są potencjalnymi dzielnikami będą zawierać się w przedziale: $$[1..[\sqrt{n}]]$$ Dla liczby 28 jest to: $$[1..[\sqrt{28}]]=[1..5]$$ Oczywiście dla liczb doskonałych nie bierzemy pod uwagę dzielnika, który jest badaną liczbą.
#include<iostream>
#include<cmath>
using namespace std;
bool czy_doskonala(int n) {
int s = 1, p = sqrt(n);
for(int i=2; i<=p; i++) {
if(n%i == 0) //dodajemy do sumy dwa dzielniki
s += i + n/i;
}
//jesli mamy do czynienia z liczbą kwadratową
//to dwa razy dodalismy jej pierwiastek
//więc musimy go raz odjąć
if(n == p*p) s-=p;
//jesli suma dzielników jest równa danej liczbie
//nasza liczba jest doskonała
if(n == s) return 1;
return 0;
}
int main() {
int n;
cout<<"Podaj liczbę: ";
cin>>n;
if(czy_doskonala(n))
cout<<"Liczba "<<n<<" jest doskonała";
else
cout<<"Liczba "<<n<<" nie jest doskonała";
return 0;
}