From afe39c0301f9d979d76725ef741025e48162649a Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 02:18:12 +0530 Subject: [PATCH] feat: add Harshad number algorithm --- Maths/HarshadNumber.js | 23 ++++++++++++++ Maths/test/HarshadNumber.test.js | 51 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 Maths/HarshadNumber.js create mode 100644 Maths/test/HarshadNumber.test.js diff --git a/Maths/HarshadNumber.js b/Maths/HarshadNumber.js new file mode 100644 index 0000000000..15d589a70b --- /dev/null +++ b/Maths/HarshadNumber.js @@ -0,0 +1,23 @@ +/** + * @function isHarshadNumber + * @description A Harshad number (also called Niven number) is an integer + * that is divisible by the sum of its digits. + * For example, 18 is a Harshad number because 1+8=9 and 18/9=2. + * @param {number} n - A positive integer + * @returns {boolean} - True if n is a Harshad number, false otherwise + * @see https://en.wikipedia.org/wiki/Harshad_number + * @example isHarshadNumber(18) => true + * @example isHarshadNumber(21) => true + * @example isHarshadNumber(19) => false + */ +const isHarshadNumber = (n) => { + if (!Number.isInteger(n) || n < 1) { + throw new TypeError('Input must be a positive integer') + } + const digitSum = String(n) + .split('') + .reduce((sum, d) => sum + Number(d), 0) + return n % digitSum === 0 +} + +export { isHarshadNumber } diff --git a/Maths/test/HarshadNumber.test.js b/Maths/test/HarshadNumber.test.js new file mode 100644 index 0000000000..ea3100cb83 --- /dev/null +++ b/Maths/test/HarshadNumber.test.js @@ -0,0 +1,51 @@ +import { isHarshadNumber } from '../HarshadNumber.js' + +describe('isHarshadNumber', () => { + test('1 is a Harshad number', () => { + expect(isHarshadNumber(1)).toBe(true) + }) + + test('18 is a Harshad number (1+8=9, 18/9=2)', () => { + expect(isHarshadNumber(18)).toBe(true) + }) + + test('21 is a Harshad number (2+1=3, 21/3=7)', () => { + expect(isHarshadNumber(21)).toBe(true) + }) + + test('12 is a Harshad number (1+2=3, 12/3=4)', () => { + expect(isHarshadNumber(12)).toBe(true) + }) + + test('100 is a Harshad number (1+0+0=1, 100/1=100)', () => { + expect(isHarshadNumber(100)).toBe(true) + }) + + test('111 is a Harshad number (1+1+1=3, 111/3=37)', () => { + expect(isHarshadNumber(111)).toBe(true) + }) + + test('19 is NOT a Harshad number (1+9=10, 19/10 is not integer)', () => { + expect(isHarshadNumber(19)).toBe(false) + }) + + test('11 is NOT a Harshad number', () => { + expect(isHarshadNumber(11)).toBe(false) + }) + + test('23 is NOT a Harshad number', () => { + expect(isHarshadNumber(23)).toBe(false) + }) + + test('throws TypeError for zero', () => { + expect(() => isHarshadNumber(0)).toThrow(TypeError) + }) + + test('throws TypeError for negative input', () => { + expect(() => isHarshadNumber(-18)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => isHarshadNumber(18.5)).toThrow(TypeError) + }) +})