diff --git a/maths/perfect_number.ts b/maths/perfect_number.ts new file mode 100644 index 00000000..c528321a --- /dev/null +++ b/maths/perfect_number.ts @@ -0,0 +1,27 @@ +/** + * @function isPerfectNumber + * @abstract A function to determine if a number is a perfect number + * @param {number} n + * + * @example console.log(isPerfectNumber(6)) => true + * @example console.log(isPerfectNumber(28)) => true + * @example console.log(isPerfectNumber(12))=> false + */ + +export const isPerfectNumber = (n: number): boolean => { + if (n <= 0 || !Number.isInteger(n)) { + return false; + } + let sum = 1; + let sqrt = Math.sqrt(n); + for (let i = 2; i < sqrt; i++) { + if (n % i === 0) { + sum += i + n / i; + } + } + if (sqrt === Math.floor(sqrt)) { + sum += sqrt; + } + + return sum === n; +}; \ No newline at end of file diff --git a/maths/test/perfect_numbers.test.ts b/maths/test/perfect_numbers.test.ts new file mode 100644 index 00000000..7d2e92c9 --- /dev/null +++ b/maths/test/perfect_numbers.test.ts @@ -0,0 +1,18 @@ +import { isPerfectNumber } from "../perfect_number"; + +describe('perfect Numbers tests', () => { + it.each([ + [6, true], + [28, true], + [496, true], + [8128, true], + [12, false], + [42, false], + [100, false], + [0, false], + [-1, false], + [1.5, false], + ])('The return value of %i should be %s', (n, expectation) => { + expect(isPerfectNumber(n)).toBe(expectation); + }); +});