diff --git a/Maths/KaprekarNumber.js b/Maths/KaprekarNumber.js new file mode 100644 index 0000000000..a17cc2d1b6 --- /dev/null +++ b/Maths/KaprekarNumber.js @@ -0,0 +1,26 @@ +/** + * @function isKaprekarNumber + * @description A Kaprekar number is a positive integer whose square can + * be split into two parts that add up to the original number. + * For example, 9: 9²=81, 8+1=9. 45: 45²=2025, 20+25=45. + * @param {number} n - A positive integer + * @returns {boolean} - True if n is a Kaprekar number, false otherwise + * @see https://en.wikipedia.org/wiki/Kaprekar_number + * @example isKaprekarNumber(9) => true + * @example isKaprekarNumber(45) => true + * @example isKaprekarNumber(10) => false + */ +const isKaprekarNumber = (n) => { + if (!Number.isInteger(n) || n < 1) { + throw new TypeError('Input must be a positive integer') + } + const square = String(n * n) + for (let i = 1; i < square.length; i++) { + const left = Number(square.slice(0, i)) || 0 + const right = Number(square.slice(i)) + if (right > 0 && left + right === n) return true + } + return false +} + +export { isKaprekarNumber } diff --git a/Maths/test/KaprekarNumber.test.js b/Maths/test/KaprekarNumber.test.js new file mode 100644 index 0000000000..edf9387e5f --- /dev/null +++ b/Maths/test/KaprekarNumber.test.js @@ -0,0 +1,51 @@ +import { isKaprekarNumber } from '../KaprekarNumber.js' + +describe('isKaprekarNumber', () => { + test('1 is NOT a Kaprekar number', () => { + expect(isKaprekarNumber(1)).toBe(false) + }) + + test('9 is a Kaprekar number (9²=81, 8+1=9)', () => { + expect(isKaprekarNumber(9)).toBe(true) + }) + + test('45 is a Kaprekar number (45²=2025, 20+25=45)', () => { + expect(isKaprekarNumber(45)).toBe(true) + }) + + test('55 is a Kaprekar number (55²=3025, 30+25=55)', () => { + expect(isKaprekarNumber(55)).toBe(true) + }) + + test('99 is a Kaprekar number (99²=9801, 98+01=99)', () => { + expect(isKaprekarNumber(99)).toBe(true) + }) + + test('297 is a Kaprekar number (297²=88209, 88+209=297)', () => { + expect(isKaprekarNumber(297)).toBe(true) + }) + + test('10 is NOT a Kaprekar number', () => { + expect(isKaprekarNumber(10)).toBe(false) + }) + + test('11 is NOT a Kaprekar number', () => { + expect(isKaprekarNumber(11)).toBe(false) + }) + + test('100 is NOT a Kaprekar number', () => { + expect(isKaprekarNumber(100)).toBe(false) + }) + + test('throws TypeError for zero', () => { + expect(() => isKaprekarNumber(0)).toThrow(TypeError) + }) + + test('throws TypeError for negative input', () => { + expect(() => isKaprekarNumber(-9)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isKaprekarNumber(9.5)).toThrow(TypeError) + }) +})