From 3b590dc59ad6b0b3f236cd70329d79736a05d8f2 Mon Sep 17 00:00:00 2001 From: Chetan Patil Date: Fri, 14 Oct 2022 00:36:13 +0200 Subject: [PATCH 1/3] :white_check_mark: test cases added for count divisible --- Maths/test/CountNumbersDivisible.test.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Maths/test/CountNumbersDivisible.test.js diff --git a/Maths/test/CountNumbersDivisible.test.js b/Maths/test/CountNumbersDivisible.test.js new file mode 100644 index 0000000000..6a694b1b93 --- /dev/null +++ b/Maths/test/CountNumbersDivisible.test.js @@ -0,0 +1,20 @@ +import { countNumbersDivisible } from '../CountNumbersDivisible' + +describe('Count the numbers divisible', () => { + test.each([ + [1, 20 ,6, 3], + [6, 15 ,3, 4], + [25, 100 ,30, 3], + [25, 70 ,10, 5], + [1, 23 ,30, 0] + ])('Total number(s) divisible between %i to %i by %i is/are %i', (n1, n2, m, expected) => { + expect(countNumbersDivisible(n1, n2, m)).toBe(expected) + }) + + test.each([ + ['test', 23 ,10, 'Invalid input, please pass only numbers'], + [44, 30, 10, 'Invalid number range, please provide numbers such that num1 < num2'] + ])('Should throw an error for input %i, %i, %i, %i', (n1, n2, m, expected) => { + expect(() => countNumbersDivisible(n1, n2, m)).toThrowError(expected) + }) +}) From fbc7ef13df4188d28c27368df0f5702f5de9822a Mon Sep 17 00:00:00 2001 From: Chetan Patil Date: Fri, 14 Oct 2022 00:36:33 +0200 Subject: [PATCH 2/3] :sparkles: count divisible math algorithm added --- Maths/CountNumbersDivisible.js | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Maths/CountNumbersDivisible.js diff --git a/Maths/CountNumbersDivisible.js b/Maths/CountNumbersDivisible.js new file mode 100644 index 0000000000..472ed75a7c --- /dev/null +++ b/Maths/CountNumbersDivisible.js @@ -0,0 +1,57 @@ +/** + * Count the numbers divisible by ‘M’ in a given range + * + * @see {@link https://www.tutorialspoint.com/count-the-numbers-divisible-by-m-in-a-given-range-in-cplusplus} + * + * We have 3 numbers A, B, M as inputs, A and B defines the numbers range [A, B] + * Count the total number of divisibles in that range by number M + * + * @author Chetan07j + */ + +/** + * Function to find total divisibles in given range + * + * @param {number} num1 + * @param {number} num2 + * @param {number} divider + * + * @returns {number} count of total number of divisibles + */ +const countNumbersDivisible = (num1, num2, divider) => { + if (typeof num1 !== 'number' || typeof num2 !== 'number' || typeof divider !== 'number') { + throw new Error('Invalid input, please pass only numbers') + } + + // Valid number range is num1 < num2, otherwise throw error + if (num1 > num2) { + throw new Error('Invalid number range, please provide numbers such that num1 < num2') + } + + // if divider is out of range then return 0 + // as in such case no divisible exists + if (divider > num2) { + return 0 + } + + // Find the number of multiples of divider for num1 and num2 + // integer division part + const num1Multiplier = num1 / divider + const num2Multiplier = num2 / divider + + // The count of numbers divisibles by divider between num1 and num2 + let divisibleCount = num2Multiplier - num1Multiplier + + // If num1 is divisible by divider then, edge case for num1 is ignored + // which results in 1 less count + // to fix that we add +1 in this case + if (num1 % divider === 0) { + divisibleCount++ + } + + // As it includes integer division meaning floating values + // to get exact count Math.round() is added + return Math.round(divisibleCount) +} + +export { countNumbersDivisible } From 1b3218bee3ead3e90ede261cdc4a4055c697917c Mon Sep 17 00:00:00 2001 From: Chetan Patil Date: Fri, 14 Oct 2022 00:39:05 +0200 Subject: [PATCH 3/3] style fixes --- Maths/test/CountNumbersDivisible.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Maths/test/CountNumbersDivisible.test.js b/Maths/test/CountNumbersDivisible.test.js index 6a694b1b93..e521828b19 100644 --- a/Maths/test/CountNumbersDivisible.test.js +++ b/Maths/test/CountNumbersDivisible.test.js @@ -2,17 +2,17 @@ import { countNumbersDivisible } from '../CountNumbersDivisible' describe('Count the numbers divisible', () => { test.each([ - [1, 20 ,6, 3], - [6, 15 ,3, 4], - [25, 100 ,30, 3], - [25, 70 ,10, 5], - [1, 23 ,30, 0] + [1, 20, 6, 3], + [6, 15, 3, 4], + [25, 100, 30, 3], + [25, 70, 10, 5], + [1, 23, 30, 0] ])('Total number(s) divisible between %i to %i by %i is/are %i', (n1, n2, m, expected) => { expect(countNumbersDivisible(n1, n2, m)).toBe(expected) }) test.each([ - ['test', 23 ,10, 'Invalid input, please pass only numbers'], + ['test', 23, 10, 'Invalid input, please pass only numbers'], [44, 30, 10, 'Invalid number range, please provide numbers such that num1 < num2'] ])('Should throw an error for input %i, %i, %i, %i', (n1, n2, m, expected) => { expect(() => countNumbersDivisible(n1, n2, m)).toThrowError(expected)