mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-04 15:39:42 +08:00
algorithm: count the numbers divisible by ‘M’ in a given range (#1185)
* ✅ test cases added for count divisible * ✨ count divisible math algorithm added * style fixes
This commit is contained in:
57
Maths/CountNumbersDivisible.js
Normal file
57
Maths/CountNumbersDivisible.js
Normal file
@ -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 }
|
20
Maths/test/CountNumbersDivisible.test.js
Normal file
20
Maths/test/CountNumbersDivisible.test.js
Normal file
@ -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)
|
||||||
|
})
|
||||||
|
})
|
Reference in New Issue
Block a user