diff --git a/Maths/AbundantNumber.js b/Maths/AbundantNumber.js new file mode 100644 index 0000000000..78840dcc87 --- /dev/null +++ b/Maths/AbundantNumber.js @@ -0,0 +1,27 @@ +/** + * @function isAbundantNumber + * @description An abundant number is a positive integer for which the + * sum of its proper divisors is greater than the number itself. + * For example, 12 is abundant because 1+2+3+4+6=16 > 12. + * @param {number} n - A positive integer + * @returns {boolean} - True if n is an abundant number, false otherwise + * @see https://en.wikipedia.org/wiki/Abundant_number + * @example isAbundantNumber(12) => true + * @example isAbundantNumber(18) => true + * @example isAbundantNumber(9) => false + */ +const isAbundantNumber = (n) => { + if (!Number.isInteger(n) || n < 1) { + throw new TypeError('Input must be a positive integer') + } + let sum = 1 + for (let i = 2; i <= Math.sqrt(n); i++) { + if (n % i === 0) { + sum += i + if (i !== n / i) sum += n / i + } + } + return sum > n +} + +export { isAbundantNumber } diff --git a/Maths/test/AbundantNumber.test.js b/Maths/test/AbundantNumber.test.js new file mode 100644 index 0000000000..54eefc3c5b --- /dev/null +++ b/Maths/test/AbundantNumber.test.js @@ -0,0 +1,47 @@ +import { isAbundantNumber } from '../AbundantNumber.js' + +describe('isAbundantNumber', () => { + test('12 is an abundant number (1+2+3+4+6=16>12)', () => { + expect(isAbundantNumber(12)).toBe(true) + }) + + test('18 is an abundant number', () => { + expect(isAbundantNumber(18)).toBe(true) + }) + + test('20 is an abundant number', () => { + expect(isAbundantNumber(20)).toBe(true) + }) + + test('24 is an abundant number', () => { + expect(isAbundantNumber(24)).toBe(true) + }) + + test('1 is NOT an abundant number', () => { + expect(isAbundantNumber(1)).toBe(false) + }) + + test('9 is NOT an abundant number', () => { + expect(isAbundantNumber(9)).toBe(false) + }) + + test('6 is NOT an abundant number (perfect number)', () => { + expect(isAbundantNumber(6)).toBe(false) + }) + + test('11 is NOT an abundant number (prime)', () => { + expect(isAbundantNumber(11)).toBe(false) + }) + + test('throws TypeError for zero', () => { + expect(() => isAbundantNumber(0)).toThrow(TypeError) + }) + + test('throws TypeError for negative input', () => { + expect(() => isAbundantNumber(-12)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isAbundantNumber(12.5)).toThrow(TypeError) + }) +})