diff --git a/Maths/CountNumbersDivisible.js b/Maths/CountNumbersDivisible.js new file mode 100644 index 000000000..472ed75a7 --- /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 } diff --git a/Maths/test/CountNumbersDivisible.test.js b/Maths/test/CountNumbersDivisible.test.js new file mode 100644 index 000000000..e521828b1 --- /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) + }) +})