Given two numbers X and Y. The task is to find the number of elements in the range [X,Y] both inclusive, that have the maximum number of divisors.
Examples:
Input: X = 2, Y = 9
Output: 2
6, 8 are numbers with the maximum number of divisors.Input: X = 1, Y = 10
Output: 3
6, 8, 10 are numbers with the maximum number of divisors.
Method 1:
- Traverse all the elements from X to Y one by one.
- Find the number of divisors of each element.
- Store the number of divisors in an array and update the maximum number of Divisors(maxDivisors).
- Traverse the array that contains divisors and counts the number of elements equal to maxDivisors.
- Return the count.
Below is the implementation of above method:
// C++ implementation of above approach #include <bits/stdc++.h> using namespace std;
// Function to count the divisors int countDivisors( int n)
{ int count = 0;
// Note that this loop runs till square root
for ( int i = 1; i <= sqrt (n); i++) {
if (n % i == 0) {
// If divisors are equal, print only one
if (n / i == i)
count++;
else // Otherwise print both
count += 2;
}
}
return count;
} // Function to count the number with // maximum divisors int MaximumDivisors( int X, int Y)
{ int maxDivisors = INT_MIN, result = 0;
// to store number of divisors
int arr[Y - X + 1];
// Traverse from X to Y
for ( int i = X; i <= Y; i++) {
// Count the number of divisors of i
int Div = countDivisors(i);
// Store the value of div in an array
arr[i - X] = Div;
// Update the value of maxDivisors
maxDivisors = max(Div, maxDivisors);
}
// Traverse the array
for ( int i = 0; i < (Y - X + 1); i++)
// Count the value equals to maxDivisors
if (arr[i] == maxDivisors)
result++;
return result;
} // Driver Code int main()
{ int X = 1, Y = 10;
// function call
cout << MaximumDivisors(X, Y) << endl;
return 0;
} |
// C implementation of above approach #include <stdio.h> #include <math.h> #include <limits.h> int max( int a, int b)
{ int max = a;
if (max < b)
max = b;
return max;
} // Function to count the divisors int countDivisors( int n)
{ int count = 0;
// Note that this loop runs till square root
for ( int i = 1; i <= sqrt (n); i++) {
if (n % i == 0) {
// If divisors are equal, print only one
if (n / i == i)
count++;
else // Otherwise print both
count += 2;
}
}
return count;
} // Function to count the number with // maximum divisors int MaximumDivisors( int X, int Y)
{ int maxDivisors = INT_MIN, result = 0;
// to store number of divisors
int arr[Y - X + 1];
// Traverse from X to Y
for ( int i = X; i <= Y; i++) {
// Count the number of divisors of i
int Div = countDivisors(i);
// Store the value of div in an array
arr[i - X] = Div;
// Update the value of maxDivisors
maxDivisors = max(Div, maxDivisors);
}
// Traverse the array
for ( int i = 0; i < (Y - X + 1); i++)
// Count the value equals to maxDivisors
if (arr[i] == maxDivisors)
result++;
return result;
} // Driver Code int main()
{ int X = 1, Y = 10;
// function call
printf ( "%d\n" ,MaximumDivisors(X, Y));
return 0;
} // This code is contributed by kothavvsaakash. |
// Java implementation of above approach class GFG
{ // Function to count the divisors static int countDivisors( int n)
{ int count = 0 ;
// Note that this loop // runs till square root for ( int i = 1 ; i <= Math.sqrt(n); i++)
{ if (n % i == 0 )
{
// If divisors are equal,
// print only one
if (n / i == i)
count++;
else // Otherwise print both
count += 2 ;
}
} return count;
} // Function to count the number // with maximum divisors static int MaximumDivisors( int X, int Y)
{ int maxDivisors = 0 , result = 0 ;
// to store number of divisors int [] arr = new int [Y - X + 1 ];
// Traverse from X to Y for ( int i = X; i <= Y; i++)
{ // Count the number of divisors of i
int Div = countDivisors(i);
// Store the value of div in an array
arr[i - X] = Div;
// Update the value of maxDivisors
maxDivisors = Math.max(Div, maxDivisors);
} // Traverse the array for ( int i = 0 ; i < (Y - X + 1 ); i++)
// Count the value equals
// to maxDivisors
if (arr[i] == maxDivisors)
result++;
return result;
} // Driver Code public static void main(String[] args)
{ int X = 1 , Y = 10 ;
// function call
System.out.println(MaximumDivisors(X, Y));
} } // This code is contributed // by ChitraNayal |
# from math module import everything from math import *
# Python 3 implementation of above approach # Function to count the divisors def countDivisors(n) :
count = 0
# Note that this loop runs till square root
for i in range ( 1 , int (sqrt(n) + 1 )) :
if n % i = = 0 :
# If divisors are equal, print only one
if n / i = = i :
count + = 1
# Otherwise print both
else :
count + = 2
return count
# Function to count the number with # maximum divisors def MaximumDivisors(X,Y) :
result = 0
maxDivisors = 0
# create list to store number of divisors
arr = []
# initialize with 0 upto length Y-X+1
for i in range (Y - X + 1 ) :
arr.append( 0 )
# Traverse from X to Y
for i in range (X,Y + 1 ) :
# Count the number of divisors of i
Div = countDivisors(i)
# Store the value of div in an array
arr[i - X] = Div
# Update the value of maxDivisors
maxDivisors = max (Div,maxDivisors)
# Traverse the array
for i in range (Y - X + 1 ) :
# Count the value equals to maxDivisors
if arr[i] = = maxDivisors :
result + = 1
return result
# Driver code if __name__ = = "__main__" :
X, Y = 1 , 10
# function call
print (MaximumDivisors(X,Y))
|
// C# implementation of above approach using System;
class GFG
{ // Function to count the divisors static int countDivisors( int n)
{ int count = 0;
// Note that this loop // runs till square root for ( int i = 1; i <= Math.Sqrt(n); i++)
{ if (n % i == 0)
{
// If divisors are equal,
// print only one
if (n / i == i)
count++;
else // Otherwise print both
count += 2;
}
} return count;
} // Function to count the number // with maximum divisors static int MaximumDivisors( int X, int Y)
{ int maxDivisors = 0, result = 0;
// to store number of divisors int [] arr = new int [Y - X + 1];
// Traverse from X to Y for ( int i = X; i <= Y; i++)
{ // Count the number of divisors of i
int Div = countDivisors(i);
// Store the value of div in an array
arr[i - X] = Div;
// Update the value of maxDivisors
maxDivisors = Math.Max(Div, maxDivisors);
} // Traverse the array for ( int i = 0; i < (Y - X + 1); i++)
// Count the value equals
// to maxDivisors
if (arr[i] == maxDivisors)
result++;
return result;
} // Driver Code public static void Main()
{ int X = 1, Y = 10;
// function call
Console.Write(MaximumDivisors(X, Y));
} } // This code is contributed // by ChitraNayal |
<?php // PHP implementation of above approach // Function to count the divisors function countDivisors( $n )
{ $count = 0;
// Note that this loop
// runs till square root
for ( $i = 1; $i <= sqrt( $n ); $i ++)
{
if ( $n % $i == 0)
{
// If divisors are equal,
// print only one
if ( $n / $i == $i )
$count ++;
else // Otherwise print both
$count += 2;
}
}
return $count ;
} // Function to count the number // with maximum divisors function MaximumDivisors( $X , $Y )
{ $maxDivisors = PHP_INT_MIN;
$result = 0;
// to store number of divisors
$arr = array_fill (0, ( $Y - $X + 1), NULL);
// Traverse from X to Y
for ( $i = $X ; $i <= $Y ; $i ++)
{
// Count the number of divisors of i
$Div = countDivisors( $i );
// Store the value of div in an array
$arr [ $i - $X ] = $Div ;
// Update the value of maxDivisors
$maxDivisors = max( $Div , $maxDivisors );
}
// Traverse the array
for ( $i = 0; $i < ( $Y - $X + 1); $i ++)
// Count the value equals to maxDivisors
if ( $arr [ $i ] == $maxDivisors )
$result ++;
return $result ;
} // Driver Code $X = 1;
$Y = 10;
// function call echo MaximumDivisors( $X , $Y ). " " ;
// This code is contributed // by ChitraNayal ?> |
<script> // Javascript implementation of above approach // Function to count the divisors function countDivisors(n)
{ let count = 0;
// Note that this loop
// runs till square root
for (let i = 1; i <= Math.sqrt(n); i++)
{
if (n % i == 0)
{
// If divisors are equal,
// print only one
if (Math.floor(n / i) == i)
count++;
else
// Otherwise print both
count += 2;
}
}
return count;
} // Function to count the number // with maximum divisors function MaximumDivisors(X, Y)
{ let maxDivisors = 0, result = 0;
// To store number of divisors
let arr = new Array(Y - X + 1);
// Traverse from X to Y
for (let i = X; i <= Y; i++)
{
// Count the number of divisors of i
let Div = countDivisors(i);
// Store the value of div in an array
arr[i - X] = Div;
// Update the value of maxDivisors
maxDivisors = Math.max(Div, maxDivisors);
}
// Traverse the array
for (let i = 0; i < (Y - X + 1); i++)
// Count the value equals
// to maxDivisors
if (arr[i] == maxDivisors)
result++;
return result;
} // Driver Code let X = 1, Y = 10; // Function call document.write(MaximumDivisors(X, Y)); // This code is contributed by rag2127 </script> |
3
Time Complexity: O(sqrt(n))
Auxiliary Space: O(n)
Method 2:
- Create an array of size Y-X+1 to store number of divisors of X in arr[0], X+1 in arr[1]… up to Y.
- To get the number of divisors of all numbers from X to Y run two loops(nested).
- Run an outer loop from 1 to sqrt(Y).
- Run an inner loop from first_divisible to Y.
- First_divisible is the number which is the first number to be divisible by I(outer loop) and greater than or equals to X.
Here, first_divisible is calculated by using Find the number closest to n and divisible by m method. Then find divisors of the number.
Below is the implementation of above approach:
// C++ implementation of above approach #include <bits/stdc++.h> using namespace std;
// Function to count the elements // with maximum number of divisors int MaximumDivisors( int X, int Y)
{ // to store number of divisors
int arr[Y - X + 1];
// initialise with zero
memset (arr, 0, sizeof (arr));
// to store the maximum number of divisors
int mx = INT_MIN;
// to store required answer
int cnt = 0;
for ( int i = 1; i * i <= Y; i++) {
int sq = i * i;
int first_divisible;
// Find the first divisible number
if ((X / i) * i >= X)
first_divisible = (X / i) * i;
else
first_divisible = (X / i + 1) * i;
// Count number of divisors
for ( int j = first_divisible; j <= Y; j += i) {
if (j < sq)
continue ;
else if (j == sq)
arr[j - X]++;
else
arr[j - X] += 2;
}
}
// Find number of elements with
// maximum number of divisors
for ( int i = X; i <= Y; i++) {
if (arr[i - X] > mx) {
cnt = 1;
mx = arr[i - X];
}
else if (arr[i - X] == mx)
cnt++;
}
return cnt;
} // Driver code int main()
{ int X = 1, Y = 10;
cout << MaximumDivisors(X, Y) << endl;
return 0;
} |
// C implementation of above approach #include <stdio.h> #include <limits.h> #include <string.h> // Function to count the elements // with maximum number of divisors int MaximumDivisors( int X, int Y)
{ // to store number of divisors
int arr[Y - X + 1];
// initialise with zero
memset (arr, 0, sizeof (arr));
// to store the maximum number of divisors
int mx = INT_MIN;
// to store required answer
int cnt = 0;
for ( int i = 1; i * i <= Y; i++) {
int sq = i * i;
int first_divisible;
// Find the first divisible number
if ((X / i) * i >= X)
first_divisible = (X / i) * i;
else
first_divisible = (X / i + 1) * i;
// Count number of divisors
for ( int j = first_divisible; j <= Y; j += i) {
if (j < sq)
continue ;
else if (j == sq)
arr[j - X]++;
else
arr[j - X] += 2;
}
}
// Find number of elements with
// maximum number of divisors
for ( int i = X; i <= Y; i++) {
if (arr[i - X] > mx) {
cnt = 1;
mx = arr[i - X];
}
else if (arr[i - X] == mx)
cnt++;
}
return cnt;
} // Driver code int main()
{ int X = 1, Y = 10;
printf ( "%d\n" ,MaximumDivisors(X, Y));
return 0;
} // This code is contributed by kothavvsaakash. |
// Java implementation of above approach class GFG
{ // Function to count the elements // with maximum number of divisors static int MaximumDivisors( int X, int Y)
{ // to store number of divisors int [] arr = new int [Y - X + 1 ];
// initialise with zero for ( int i = 0 ; i < arr.length; i++)
arr[i] = 0 ;
// to store the maximum // number of divisors int mx = 0 ;
// to store required answer int cnt = 0 ;
for ( int i = 1 ; i * i <= Y; i++)
{ int sq = i * i;
int first_divisible;
// Find the first divisible number
if ((X / i) * i >= X)
first_divisible = (X / i) * i;
else
first_divisible = (X / i + 1 ) * i;
// Count number of divisors
for ( int j = first_divisible;
j <= Y; j += i)
{
if (j < sq)
continue ;
else if (j == sq)
arr[j - X]++;
else
arr[j - X] += 2 ;
}
} // Find number of elements with // maximum number of divisors for ( int i = X; i <= Y; i++)
{ if (arr[i - X] > mx)
{
cnt = 1 ;
mx = arr[i - X];
}
else if (arr[i - X] == mx)
cnt++;
} return cnt;
} // Driver code public static void main(String[] args)
{ int X = 1 , Y = 10 ;
System.out.println(MaximumDivisors(X, Y));
} } // This code is contributed // by ChitraNayal |
# Python 3 implementation of above approach # Function to count the elements # with maximum number of divisors def MaximumDivisors(X, Y):
# to store number of divisors
# initialise with zero
arr = [ 0 ] * (Y - X + 1 )
# to store the maximum
# number of divisors
mx = 0
# to store required answer
cnt = 0
i = 1
while i * i < = Y :
sq = i * i
# Find the first divisible number
if ((X / / i) * i > = X) :
first_divisible = (X / / i) * i
else :
first_divisible = (X / / i + 1 ) * i
# Count number of divisors
for j in range (first_divisible, Y + 1 , i):
if j < sq :
continue
elif j = = sq :
arr[j - X] + = 1
else :
arr[j - X] + = 2
i + = 1
# Find number of elements with
# maximum number of divisors
for i in range (X, Y + 1 ):
if arr[i - X] > mx :
cnt = 1
mx = arr[i - X]
elif arr[i - X] = = mx :
cnt + = 1
return cnt
# Driver code if __name__ = = "__main__" :
X = 1
Y = 10
print (MaximumDivisors(X, Y))
# This code is contributed # by ChitraNayal |
// C# implementation of above approach using System;
class GFG
{ // Function to count the elements // with maximum number of divisors static int MaximumDivisors( int X, int Y)
{ // to store number of divisors int [] arr = new int [Y - X + 1];
// initialise with zero for ( int i = 0; i < arr.Length; i++)
arr[i] = 0;
// to store the maximum // number of divisors int mx = 0;
// to store required answer int cnt = 0;
for ( int i = 1; i * i <= Y; i++)
{ int sq = i * i;
int first_divisible;
// Find the first divisible number
if ((X / i) * i >= X)
first_divisible = (X / i) * i;
else
first_divisible = (X / i + 1) * i;
// Count number of divisors
for ( int j = first_divisible;
j <= Y; j += i)
{
if (j < sq)
continue ;
else if (j == sq)
arr[j - X]++;
else
arr[j - X] += 2;
}
} // Find number of elements with // maximum number of divisors for ( int i = X; i <= Y; i++)
{ if (arr[i - X] > mx)
{
cnt = 1;
mx = arr[i - X];
}
else if (arr[i - X] == mx)
cnt++;
} return cnt;
} // Driver code public static void Main()
{ int X = 1, Y = 10;
Console.Write(MaximumDivisors(X, Y));
} } // This code is contributed // by ChitraNayal |
<?php // PHP implementation of above approach // Function to count the elements // with maximum number of divisors function MaximumDivisors( $X , $Y )
{ // to store number of divisors
// initialise with zero
$arr = array_fill (0,( $Y - $X + 1), NULL);
// to store the maximum
// number of divisors
$mx = PHP_INT_MIN;
// to store required answer
$cnt = 0;
for ( $i = 1; $i * $i <= $Y ; $i ++)
{
$sq = $i * $i ;
// Find the first divisible number
if (( $X / $i ) * $i >= $X )
$first_divisible = ( $X / $i ) * $i ;
else
$first_divisible = ( $X / $i + 1) * $i ;
// Count number of divisors
for ( $j = $first_divisible ;
$j < $Y ; $j += $i )
{
if ( $j < $sq )
continue ;
else if ( $j == $sq )
$arr [ $j - $X ]++;
else
$arr [ $j - $X ] += 2;
}
}
// Find number of elements with
// maximum number of divisors
for ( $i = $X ; $i <= $Y ; $i ++)
{
if ( $arr [ $i - $X ] > $mx )
{
$cnt = 1;
$mx = $arr [ $i - $X ];
}
else if ( $arr [ $i - $X ] == $mx )
$cnt ++;
}
return $cnt ;
} // Driver code $X = 1;
$Y = 10;
echo MaximumDivisors( $X , $Y ). "\n" ;
// This code is contributed // by ChitraNayal ?> |
<script> // Javascript implementation of above approach // Function to count the elements // with maximum number of divisors function MaximumDivisors(X, Y)
{ // To store number of divisors
let arr = new Array(Y - X + 1);
// Initialise with zero
for (let i = 0; i < arr.length; i++)
arr[i] = 0;
// To store the maximum
// number of divisors
let mx = 0;
// To store required answer
let cnt = 0;
for (let i = 1; i * i <= Y; i++)
{
let sq = i * i;
let first_divisible;
// Find the first divisible number
if (Math.floor(X / i) * i >= X)
first_divisible = Math.floor(X / i) * i;
else
first_divisible = (Math.floor(X / i) +
1) * i;
// Count number of divisors
for (let j = first_divisible;
j <= Y; j += i)
{
if (j < sq)
continue ;
else if (j == sq)
arr[j - X]++;
else
arr[j - X] += 2;
}
}
// Find number of elements with
// maximum number of divisors
for (let i = X; i <= Y; i++)
{
if (arr[i - X] > mx)
{
cnt = 1;
mx = arr[i - X];
}
else if (arr[i - X] == mx)
cnt++;
}
return cnt;
} // Driver code let X = 1, Y = 10; document.write(MaximumDivisors(X, Y)); // This code is contributed by avanitrachhadiya2155 </script> |
3
Time Complexity : O((Y – X + 1) * sqrt(Y))
Space Complexity : O(Y – X + 1)