From c44d3024084452a38e10bcc5a1f5e15ea57e6c60 Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 10:41:20 +0530 Subject: [PATCH] feat: add neon number algorithm --- Maths/NeonNumber.js | 25 +++++++++++++++++++ Maths/test/NeonNumber.test.js | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 Maths/NeonNumber.js create mode 100644 Maths/test/NeonNumber.test.js diff --git a/Maths/NeonNumber.js b/Maths/NeonNumber.js new file mode 100644 index 0000000000..94a16a7704 --- /dev/null +++ b/Maths/NeonNumber.js @@ -0,0 +1,25 @@ +/** + * @function isNeonNumber + * @description A neon number is a number where the sum of digits of + * its square equals the number itself. + * For example, 9: 9² = 81, 8+1 = 9. + * @param {number} n - A non-negative integer + * @returns {boolean} - True if n is a neon number, false otherwise + * @see https://en.wikipedia.org/wiki/Neon_number + * @example isNeonNumber(9) => true + * @example isNeonNumber(1) => true + * @example isNeonNumber(0) => true + * @example isNeonNumber(2) => false + */ +const isNeonNumber = (n) => { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError('Input must be a non-negative integer') + } + const square = n * n + const digitSum = String(square) + .split('') + .reduce((sum, d) => sum + Number(d), 0) + return digitSum === n +} + +export { isNeonNumber } diff --git a/Maths/test/NeonNumber.test.js b/Maths/test/NeonNumber.test.js new file mode 100644 index 0000000000..1f627f4101 --- /dev/null +++ b/Maths/test/NeonNumber.test.js @@ -0,0 +1,47 @@ +import { isNeonNumber } from '../NeonNumber.js' + +describe('isNeonNumber', () => { + test('0 is a neon number (0²=0, 0=0)', () => { + expect(isNeonNumber(0)).toBe(true) + }) + + test('1 is a neon number (1²=1, 1=1)', () => { + expect(isNeonNumber(1)).toBe(true) + }) + + test('9 is a neon number (9²=81, 8+1=9)', () => { + expect(isNeonNumber(9)).toBe(true) + }) + + test('2 is NOT a neon number (2²=4, 4≠2)', () => { + expect(isNeonNumber(2)).toBe(false) + }) + + test('3 is NOT a neon number (3²=9, 9≠3)', () => { + expect(isNeonNumber(3)).toBe(false) + }) + + test('5 is NOT a neon number (5²=25, 2+5=7≠5)', () => { + expect(isNeonNumber(5)).toBe(false) + }) + + test('10 is NOT a neon number (10²=100, 1+0+0=1≠10)', () => { + expect(isNeonNumber(10)).toBe(false) + }) + + test('8 is NOT a neon number (8²=64, 6+4=10≠8)', () => { + expect(isNeonNumber(8)).toBe(false) + }) + + test('throws TypeError for negative input', () => { + expect(() => isNeonNumber(-9)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isNeonNumber(9.5)).toThrow(TypeError) + }) + + test('throws TypeError for string input', () => { + expect(() => isNeonNumber('9')).toThrow(TypeError) + }) +})