diff --git a/Maths/DisariumNumber.js b/Maths/DisariumNumber.js new file mode 100644 index 0000000000..81b553903f --- /dev/null +++ b/Maths/DisariumNumber.js @@ -0,0 +1,22 @@ +/** + * @function isDisariumNumber + * @description A Disarium number is a number where the sum of its digits + * powered with their respective positions is equal to the number itself. + * For example, 135: 1¹ + 3² + 5³ = 1 + 9 + 125 = 135. + * @param {number} n - A positive integer + * @returns {boolean} - True if n is a Disarium number, false otherwise + * @see https://en.wikipedia.org/wiki/Disarium_number + * @example isDisariumNumber(135) => true + * @example isDisariumNumber(89) => true + * @example isDisariumNumber(10) => false + */ +const isDisariumNumber = (n) => { + if (!Number.isInteger(n) || n < 1) { + throw new TypeError('Input must be a positive integer') + } + const digits = String(n).split('') + const sum = digits.reduce((acc, d, i) => acc + Math.pow(Number(d), i + 1), 0) + return sum === n +} + +export { isDisariumNumber } diff --git a/Maths/test/DisariumNumber.test.js b/Maths/test/DisariumNumber.test.js new file mode 100644 index 0000000000..aa4578b597 --- /dev/null +++ b/Maths/test/DisariumNumber.test.js @@ -0,0 +1,51 @@ +import { isDisariumNumber } from '../DisariumNumber.js' + +describe('isDisariumNumber', () => { + test('1 is a Disarium number (1¹=1)', () => { + expect(isDisariumNumber(1)).toBe(true) + }) + + test('2 is a Disarium number (2¹=2)', () => { + expect(isDisariumNumber(2)).toBe(true) + }) + + test('89 is a Disarium number (8¹+9²=8+81=89)', () => { + expect(isDisariumNumber(89)).toBe(true) + }) + + test('135 is a Disarium number (1¹+3²+5³=1+9+125=135)', () => { + expect(isDisariumNumber(135)).toBe(true) + }) + + test('175 is a Disarium number', () => { + expect(isDisariumNumber(175)).toBe(true) + }) + + test('518 is a Disarium number', () => { + expect(isDisariumNumber(518)).toBe(true) + }) + + test('10 is NOT a Disarium number', () => { + expect(isDisariumNumber(10)).toBe(false) + }) + + test('12 is NOT a Disarium number', () => { + expect(isDisariumNumber(12)).toBe(false) + }) + + test('100 is NOT a Disarium number', () => { + expect(isDisariumNumber(100)).toBe(false) + }) + + test('throws TypeError for zero', () => { + expect(() => isDisariumNumber(0)).toThrow(TypeError) + }) + + test('throws TypeError for negative input', () => { + expect(() => isDisariumNumber(-135)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isDisariumNumber(13.5)).toThrow(TypeError) + }) +})