forked from TheAlgorithms/JavaScript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CountNumbersDivisible.js
57 lines (49 loc) · 1.72 KB
/
CountNumbersDivisible.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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 }