Given two integers N and M, the task is to print all elements in the range [N, M] having at least one odd divisor.
Examples:
Input: N = 2, M = 10
Output: 3 5 6 7 9 10
Explanation:
3, 6 have an odd divisor 3
5, 10 have an odd divisor 5
7 have an odd divisor 7
9 have two odd divisors 3, 9Input: N = 15, M = 20
Output: 15 17 18 19 20
Naive Approach:
The simplest approach is to loop through all numbers in the range [1, N], and for every element, check if it has an odd divisor or not.
Time Complexity: O(N^{3/2})
Efficient Approach:
To optimize the above approach, we need to observe the following details:
- Any number which is a power of 2, does not have any odd divisors.
- All other elements will have at least one odd divisors
Illustration:
In the range [3, 10], the elements which have at least one odd divisors are {3, 5, 6, 7, 9, 10} and {4, 8} does not contain any odd divisors.
Follow the steps below to solve the problem:
- Traverse the range [N, M] and check for each element if any of its set bit is set in the previous number or not, that is check whether i & (i – 1) is equal to 0 or not.
- If so, then the number is a power of 2 and is not considered. Otherwise, print the number as it is not a power of 2 and has at least one odd divisor.
Below is the implementation of the above approach.
C++
// C++ program to print all numbers // with least one odd factor in the // given range #include <bits/stdc++.h> using namespace std; // Function to prints all numbers // with at least one odd divisor int printOddFactorNumber( int n, int m) { for ( int i = n; i <= m; i++) { // Check if the number is // not a power of two if ((i > 0) && ((i & (i - 1)) != 0)) cout << i << " " ; } } // Driver Code int main() { int N = 2, M = 10; printOddFactorNumber(N, M); return 0; } |
Java
// Java program to print all numbers // with least one odd factor in the // given range class GFG{ // Function to prints all numbers // with at least one odd divisor static int printOddFactorNumber( int n, int m) { for ( int i = n; i <= m; i++) { // Check if the number is // not a power of two if ((i > 0 ) && ((i & (i - 1 )) != 0 )) System.out.print(i + " " ); } return 0 ; } // Driver Code public static void main(String[] args) { int N = 2 , M = 10 ; printOddFactorNumber(N, M); } } // This code is contributed // by shivanisinghss2110 |
Python3
# Python3 program to print all numbers # with least one odd factor in the # given range # Function to prints all numbers # with at least one odd divisor def printOddFactorNumber(n, m): for i in range (n, m + 1 ): # Check if the number is # not a power of two if ((i > 0 ) and ((i & (i - 1 )) ! = 0 )): print (i, end = " " ) # Driver Code N = 2 M = 10 printOddFactorNumber(N, M) # This code is contributed by Vishal Maurya |
C#
// C# program to print all numbers // with least one odd factor in the // given range using System; class GFG{ // Function to prints all numbers // with at least one odd divisor static int printOddFactorNumber( int n, int m) { for ( int i = n; i <= m; i++) { // Check if the number is // not a power of two if ((i > 0) && ((i & (i - 1)) != 0)) Console.Write(i + " " ); } return 0; } // Driver Code public static void Main() { int N = 2, M = 10; printOddFactorNumber(N, M); } } // This code is contributed // by Code_Mech |
3 5 6 7 9 10
Time Complexity: O(N)
Auxiliary Space: O(1)
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.