diff --git a/Maths/DudeneyNumber.js b/Maths/DudeneyNumber.js new file mode 100644 index 0000000000..1ba853f3e4 --- /dev/null +++ b/Maths/DudeneyNumber.js @@ -0,0 +1,25 @@ +/** + * @function isDudeneyNumber + * @description A Dudeney number is a positive integer that is a perfect + * cube such that the sum of its digits equals the cube root of the number. + * For example, 512: cube root of 512 = 8, and 5+1+2 = 8. + * @param {number} n - A positive integer + * @returns {boolean} - True if n is a Dudeney number, false otherwise + * @see https://en.wikipedia.org/wiki/Dudeney_number + * @example isDudeneyNumber(512) => true + * @example isDudeneyNumber(1) => true + * @example isDudeneyNumber(100) => false + */ +const isDudeneyNumber = (n) => { + if (!Number.isInteger(n) || n < 1) { + throw new TypeError('Input must be a positive integer') + } + const cubeRoot = Math.round(Math.cbrt(n)) + if (cubeRoot ** 3 !== n) return false + const digitSum = String(n) + .split('') + .reduce((sum, d) => sum + Number(d), 0) + return digitSum === cubeRoot +} + +export { isDudeneyNumber } diff --git a/Maths/test/DudeneyNumber.test.js b/Maths/test/DudeneyNumber.test.js new file mode 100644 index 0000000000..7989b2b837 --- /dev/null +++ b/Maths/test/DudeneyNumber.test.js @@ -0,0 +1,47 @@ +import { isDudeneyNumber } from '../DudeneyNumber.js' + +describe('isDudeneyNumber', () => { + test('1 is a Dudeney number (1³=1, 1=1)', () => { + expect(isDudeneyNumber(1)).toBe(true) + }) + + test('512 is a Dudeney number (8³=512, 5+1+2=8)', () => { + expect(isDudeneyNumber(512)).toBe(true) + }) + + test('4913 is a Dudeney number (17³=4913, 4+9+1+3=17)', () => { + expect(isDudeneyNumber(4913)).toBe(true) + }) + + test('5832 is a Dudeney number (18³=5832, 5+8+3+2=18)', () => { + expect(isDudeneyNumber(5832)).toBe(true) + }) + + test('17576 is a Dudeney number (26³=17576, 1+7+5+7+6=26)', () => { + expect(isDudeneyNumber(17576)).toBe(true) + }) + + test('100 is NOT a Dudeney number', () => { + expect(isDudeneyNumber(100)).toBe(false) + }) + + test('8 is NOT a Dudeney number (2³=8, 8≠2)', () => { + expect(isDudeneyNumber(8)).toBe(false) + }) + + test('27 is NOT a Dudeney number (3³=27, 2+7=9≠3)', () => { + expect(isDudeneyNumber(27)).toBe(false) + }) + + test('throws TypeError for zero', () => { + expect(() => isDudeneyNumber(0)).toThrow(TypeError) + }) + + test('throws TypeError for negative input', () => { + expect(() => isDudeneyNumber(-512)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isDudeneyNumber(51.2)).toThrow(TypeError) + }) +})