The Algorithms logo
The Algorithms
Acerca deDonar

Count Numbers Divisible

/**
 * 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 }