#include <cassert>
#include <cmath>
bool is_perfect(int num)
{
int sum = 0;
if (num > 1)
{
sum = 1;
for (int i = 2; i <= (int)sqrt((double)num); i++)
{
if (0 == (num % i))
{
sum += i;
sum += num / i;
}
}
}
return sum == num;
}
void test_is_perfect()
{
assert(is_perfect(6));
assert(is_perfect(28));
assert(is_perfect(496));
assert(is_perfect(8128));
}
const int perfects[] = {6, 28, 496, 8128};
const int size = sizeof(perfects) / sizeof(perfects[0]);
bool in_perfects(int num)
{
bool found = false;
int i = 0;
while(!found && i < size)
{
found = (num == perfects[i++]);
}
return found;
}
void test_is_not_perfect()
{
for (int i = 1; i < 100000; i++)
{
if (in_perfects(i))
{
assert(is_perfect(i));
}
else
{
assert(!is_perfect(i));
}
}
}
int main()
{
test_is_perfect();
test_is_not_perfect();
return 0;
}