From db479a44b165651ebe2d4d2699d20aaf48fed859 Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sun, 1 Nov 2026 21:21:35 +0530 Subject: [PATCH] feat: add Perfect number algorithm --- Maths/PerfectNumber.js | 50 +++++++++++++++----------------- Maths/test/PerfectNumber.test.js | 45 ++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 32 deletions(-) diff --git a/Maths/PerfectNumber.js b/Maths/PerfectNumber.js index ce8adefb6c..063c980d38 100644 --- a/Maths/PerfectNumber.js +++ b/Maths/PerfectNumber.js @@ -1,30 +1,28 @@ /** - * Author: dephraiim - * License: GPL-3.0 or later - * - * == Perfect Number == - * In number theory, a perfect number is a positive integer that is equal to the sum of - * its positive divisors(factors), excluding the number itself. - * For example: 6 ==> divisors[1, 2, 3, 6] - * Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6 - * So, 6 is a Perfect Number - * Other examples of Perfect Numbers: 28, 486, ... - * - * More on Perfect Number: - * https://en.wikipedia.org/wiki/Perfect_number - * + * @function isPerfectNumber + * @description A perfect number is a positive integer that is equal to the sum + * of its positive divisors, excluding the number itself. For example, 28 is + * perfect because 1 + 2 + 4 + 7 + 14 = 28. + * @param {number} n - A positive integer + * @returns {boolean} - True if n is a perfect number, false otherwise + * @see https://en.wikipedia.org/wiki/Perfect_number + * @example isPerfectNumber(6) => true + * @example isPerfectNumber(28) => true + * @example isPerfectNumber(12) => false */ - -const factorsExcludingNumber = (n) => { - return [...Array(n).keys()].filter((num) => n % num === 0) -} - -const perfectNumber = (n) => { - const factorSum = factorsExcludingNumber(n).reduce((num, initialValue) => { - return num + initialValue - }, 0) - - return factorSum === n +const isPerfectNumber = (n) => { + if (!Number.isInteger(n) || n < 1) { + throw new TypeError('Input must be a positive integer') + } + if (n === 1) return false + 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 { perfectNumber } +export { isPerfectNumber } diff --git a/Maths/test/PerfectNumber.test.js b/Maths/test/PerfectNumber.test.js index 55b7d84269..03000ddab5 100644 --- a/Maths/test/PerfectNumber.test.js +++ b/Maths/test/PerfectNumber.test.js @@ -1,10 +1,43 @@ -import { perfectNumber } from '../PerfectNumber' +import { isPerfectNumber } from '../PerfectNumber.js' -describe('PerfectNumber', () => { - it('should return true for a perfect cube', () => { - expect(perfectNumber(28)).toBeTruthy() +describe('isPerfectNumber', () => { + test('6 is a perfect number (1+2+3=6)', () => { + expect(isPerfectNumber(6)).toBe(true) }) - it('should return false for a non perfect cube', () => { - expect(perfectNumber(10)).toBeFalsy() + + test('28 is a perfect number (1+2+4+7+14=28)', () => { + expect(isPerfectNumber(28)).toBe(true) + }) + + test('496 is a perfect number', () => { + expect(isPerfectNumber(496)).toBe(true) + }) + + test('8128 is a perfect number', () => { + expect(isPerfectNumber(8128)).toBe(true) + }) + + test('1 is NOT a perfect number', () => { + expect(isPerfectNumber(1)).toBe(false) + }) + + test('12 is NOT a perfect number', () => { + expect(isPerfectNumber(12)).toBe(false) + }) + + test('100 is NOT a perfect number', () => { + expect(isPerfectNumber(100)).toBe(false) + }) + + test('throws TypeError for zero', () => { + expect(() => isPerfectNumber(0)).toThrow(TypeError) + }) + + test('throws TypeError for negative input', () => { + expect(() => isPerfectNumber(-5)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isPerfectNumber(2.5)).toThrow(TypeError) }) })