From 5a69a9cf5067254db9484033ebc97e024eb49de9 Mon Sep 17 00:00:00 2001 From: sarthakgupta1907-cell Date: Sat, 7 Nov 2026 10:59:11 +0530 Subject: [PATCH] feat: add digit product algorithm --- Maths/DigitProduct.js | 20 ++++++++++++++ Maths/test/DigitProduct.test.js | 47 +++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 Maths/DigitProduct.js create mode 100644 Maths/test/DigitProduct.test.js diff --git a/Maths/DigitProduct.js b/Maths/DigitProduct.js new file mode 100644 index 0000000000..910b221768 --- /dev/null +++ b/Maths/DigitProduct.js @@ -0,0 +1,20 @@ +/** + * @function digitProduct + * @description Calculates the product of all digits of a given integer. + * @param {number} n - A non-negative integer + * @returns {number} - The product of all digits + * @see https://en.wikipedia.org/wiki/Multiplicative_digital_root + * @example digitProduct(123) => 6 + * @example digitProduct(999) => 729 + * @example digitProduct(0) => 0 + */ +const digitProduct = (n) => { + if (!Number.isInteger(n) || n < 0) { + throw new TypeError('Input must be a non-negative integer') + } + return String(n) + .split('') + .reduce((product, d) => product * Number(d), 1) +} + +export { digitProduct } diff --git a/Maths/test/DigitProduct.test.js b/Maths/test/DigitProduct.test.js new file mode 100644 index 0000000000..ade5f74fe7 --- /dev/null +++ b/Maths/test/DigitProduct.test.js @@ -0,0 +1,47 @@ +import { digitProduct } from '../DigitProduct.js' + +describe('digitProduct', () => { + test('digitProduct(0) returns 0', () => { + expect(digitProduct(0)).toBe(0) + }) + + test('digitProduct(1) returns 1', () => { + expect(digitProduct(1)).toBe(1) + }) + + test('digitProduct(123) returns 6', () => { + expect(digitProduct(123)).toBe(6) + }) + + test('digitProduct(999) returns 729', () => { + expect(digitProduct(999)).toBe(729) + }) + + test('digitProduct(111) returns 1', () => { + expect(digitProduct(111)).toBe(1) + }) + + test('digitProduct(100) returns 0', () => { + expect(digitProduct(100)).toBe(0) + }) + + test('digitProduct(99) returns 81', () => { + expect(digitProduct(99)).toBe(81) + }) + + test('digitProduct(555) returns 125', () => { + expect(digitProduct(555)).toBe(125) + }) + + test('throws TypeError for negative input', () => { + expect(() => digitProduct(-123)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => digitProduct(1.5)).toThrow(TypeError) + }) + + test('throws TypeError for string input', () => { + expect(() => digitProduct('123')).toThrow(TypeError) + }) +})