diff --git a/math/check_amicable_pair.cpp b/math/check_amicable_pair.cpp new file mode 100644 index 000000000..83a5d7364 --- /dev/null +++ b/math/check_amicable_pair.cpp @@ -0,0 +1,70 @@ +/** + * + * @file + * \brief A C++ Program to check whether a pair of number is [amicable pair](https://en.wikipedia.org/wiki/Amicable_numbers) or not. + * + * \details + * Amicable Pair are two positive integers such that sum of the proper divisor + * of each number is equal to the other number. + * @author iamnambiar + */ +#include +#include + +/** + * Function to calculate the sum of all the proper divisor + * of an integer. + * @param num First number. + * @return Sum of the proper divisor of the number. + */ +int sum_of_divisor(int num) { + // Variable to store the sum of all proper divisors. + int sum = 0; + // Below loop condition helps to reduce Time complexity by a factor of square root of the number. + for (int div = 2; div * div <= num; ++div) { + // Check 'div' is divisor of 'num'. + if (num % div == 0) { + // If both divisor are same, add once to 'sum' + if (div == (num / div)) { + sum += div; + } else { + // If both divisor are not the same, add both to 'sum'. + sum += (div + (num / div)); + } + } + } + return sum + 1; +} + +/** + * Function to check whether the pair is amicable or not. + * @param x First number. + * @param y Second number. + * @return `true` if the pair is amicable + * @return `false` if the pair is not amicable + */ +bool are_amicable(int x, int y) { + return (sum_of_divisor(x) == y) && (sum_of_divisor(y) == x); +} + +/** + * Function for testing the is_amicable() with + * all the test cases. + */ +void test() { + // are_amicable(220, 284) returns true. + assert(are_amicable(220, 284) == true); + // are_amicable(6232, 6368) returns true. + assert(are_amicable(6368, 6232) == true); + // are_amicable(458, 232) returns false. + assert(are_amicable(458, 232) == false); +} + +/** + * Main Function +*/ +int main() { + test(); + std::cout << "Assertion Success." << std::endl; + return 0; +}