diff --git a/Maths/ArmstrongNumber.js b/Maths/ArmstrongNumber.js index 8f861d8c15..7b384a81cb 100644 --- a/Maths/ArmstrongNumber.js +++ b/Maths/ArmstrongNumber.js @@ -1,4 +1,26 @@ /** + * @function isArmstrongNumber + * @description An Armstrong number (also known as a narcissistic number) is a + * number that is equal to the sum of its own digits each raised to the power + * of the number of digits. For example, 153 = 1³ + 5³ + 3³ = 153. + * @param {number} n - A positive integer + * @returns {boolean} - True if n is an Armstrong number, false otherwise + * @see https://en.wikipedia.org/wiki/Narcissistic_number + * @example isArmstrongNumber(153) => true + * @example isArmstrongNumber(9474) => true + * @example isArmstrongNumber(10) => false + */ +const isArmstrongNumber = (n) => { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError('Input must be a non-negative integer') + } + const digits = String(n).split('') + const power = digits.length + const sum = digits.reduce((acc, d) => acc + Math.pow(Number(d), power), 0) + return sum === n +} + +export { isArmstrongNumber } /** * Author: dephraiim * License: GPL-3.0 or later * diff --git a/Maths/test/ArmstrongNumber.test.js b/Maths/test/ArmstrongNumber.test.js index 01da1631da..edae1f0479 100644 --- a/Maths/test/ArmstrongNumber.test.js +++ b/Maths/test/ArmstrongNumber.test.js @@ -1,14 +1,45 @@ -import { armstrongNumber } from '../ArmstrongNumber' +import { isArmstrongNumber } from '../ArmstrongNumber.js' -describe('ArmstrongNumber', () => { - it('should return true for an armstrong number', () => { - expect(armstrongNumber(371)).toBeTruthy() +describe('isArmstrongNumber', () => { + test('single digit numbers are always Armstrong numbers', () => { + for (let i = 0; i <= 9; i++) { + expect(isArmstrongNumber(i)).toBe(true) + } }) - it('should return false for a non-armstrong number', () => { - expect(armstrongNumber(300)).toBeFalsy() + test('153 is an Armstrong number', () => { + expect(isArmstrongNumber(153)).toBe(true) }) - it('should return false for negative values', () => { - expect(armstrongNumber(-2)).toBeFalsy() + + test('370 is an Armstrong number', () => { + expect(isArmstrongNumber(370)).toBe(true) + }) + + test('371 is an Armstrong number', () => { + expect(isArmstrongNumber(371)).toBe(true) + }) + + test('407 is an Armstrong number', () => { + expect(isArmstrongNumber(407)).toBe(true) + }) + + test('9474 is a 4-digit Armstrong number', () => { + expect(isArmstrongNumber(9474)).toBe(true) + }) + + test('10 is NOT an Armstrong number', () => { + expect(isArmstrongNumber(10)).toBe(false) + }) + + test('100 is NOT an Armstrong number', () => { + expect(isArmstrongNumber(100)).toBe(false) + }) + + test('throws TypeError for negative input', () => { + expect(() => isArmstrongNumber(-1)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isArmstrongNumber(1.5)).toThrow(TypeError) }) })