(C++) IsPerfect

January 6, 2018 ยท View on GitHub

IsPerfect is a code snippet to check if a number is perfect.

#include <cassert>

///GetSumProperDivisors returns the sum of all proper divisors of x
int GetSumProperDivisors(const int x)
{
  if (x < 1) 
  {
    throw std::invalid_argument("x must be at least 1")
  }
  assert(x > 0);
  int sum = 0;
  if (x <= 0) return 0;
  const int j{(x / 2) + 1};
  for (int i=1; i!=j; ++i)
  {
    //Is i a proper divisor of x?
    if (x % i == 0)
    {
      sum+=i;
    }
  }
  return sum;
}

///IsPerfect determines if x is a perfect number
bool IsPerfect(const int x) noexcept
{
  if (x < 1) 
  {
    return false;
  }
  return GetSumProperDivisors(x) == x;
}

int main()
{
  assert(!IsPerfect( 1));
  assert(!IsPerfect( 2));
  assert(!IsPerfect( 3));
  assert(!IsPerfect( 4));
  assert(!IsPerfect( 5));
  assert( IsPerfect( 6));
  assert(!IsPerfect( 7));
  assert(!IsPerfect( 8));
  assert(!IsPerfect( 9));
  assert(!IsPerfect(10));
  assert(!IsPerfect(11));
  assert(!IsPerfect(12));
  assert(!IsPerfect(13));
  assert(!IsPerfect(14));
  assert(!IsPerfect(15));
  assert(!IsPerfect(16));
  assert(!IsPerfect(17));
  assert(!IsPerfect(18));
  assert(!IsPerfect(19));
  assert(!IsPerfect(20));
  assert(!IsPerfect(21));
  assert(!IsPerfect(22));
  assert(!IsPerfect(23));
  assert(!IsPerfect(24));
  assert(!IsPerfect(25));
  assert(!IsPerfect(26));
  assert(!IsPerfect(27));
  assert( IsPerfect(28));
  assert(!IsPerfect(29));
  assert(!IsPerfect(30));
  assert(!IsPerfect(31));
  assert(!IsPerfect(32));
  assert(!IsPerfect(33));
  assert(!IsPerfect(34));
  assert(!IsPerfect(35));
  assert(!IsPerfect(36));
}