Problem 21 : Amicable numbers
Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n).
If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and each of a and b are called amicable numbers.
For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142; so d(284) = 220.
Evaluate the sum of all the amicable numbers under 10000.
C++ source code
#include <iostream>
#include <cmath> // sqrt()
#include <cassert> // assert()
using namespace std;
class PE0021
{
private:
int getSumOfProperDivisors(int number);
public:
bool checkAmicableNumbers(int a, int b);
int getSumOfAmicableNumbers(int max);
};
int PE0021::getSumOfProperDivisors(int number)
{
int sum = 1;
for(int i=2; i<(int)sqrt((double)number); i++)
{
if (0 == number%i)
{
sum += i + number/i;
}
if (i*i == number)
{
sum -= i;
}
}
return sum;
}
bool PE0021::checkAmicableNumbers(int a, int b)
{
if (a == getSumOfProperDivisors(b) &&
b == getSumOfProperDivisors(a))
{
return true;
}
else
{
return false;
}
}
int PE0021::getSumOfAmicableNumbers(int max)
{
int b;
int sum = 0;
for(int a=1; a<max; a++)
{
b = getSumOfProperDivisors(a);
if (b != a && true == checkAmicableNumbers(a, b))
{
sum += a;
}
}
return sum;
}
int main()
{
PE0021 pe0021;
assert(true == pe0021.checkAmicableNumbers(220, 284));
cout << "The sum of all the amicable numbers under 10000 is ";
cout << pe0021.getSumOfAmicableNumbers(10000) << endl;
return 0;
}
Python source code
import math
def d(n):
sum = 1
root = math.sqrt(n)
for i in range(2, int(root)+1):
if n % i == 0:
sum += i + n/i
if root == int(root):
sum -= root #correct sum if n is a perfect square
return sum
def checkAmicableNumbers(a, b):
if (a == d(b) and b == d(a)):
return True
else:
return False
def getSumOfAmicableNumbers(max):
sum = 0
for a in range(1, max):
b = d(a)
if b != a and True == checkAmicableNumbers(a, b):
sum += a
return sum
def main():
assert True == checkAmicableNumbers(220, 284)
print("The sum of all the amicable numbers under 10000 is",
getSumOfAmicableNumbers(10000))
if __name__ == '__main__':
main()