Given two integers L and R, the task is to count numbers from the range [L, R] having odd digits at odd positions and even digits at even positions respectively.
Examples:
Input: L = 3, R = 25
Output: 9
Explanation: The numbers satisfying the conditions are 3, 5, 7, 9, 10, 12, 14, 16 and 18.Input: L = 128, R = 162
Output: 7
Explanation: The numbers satisfying the conditions are 129, 141, 143, 145, 147, 149 and 161.
Approach: The given problem can be solved based on the following observations:
It can be observed that every even position has 5 choices {0, 2, 4, 6, 8} and every odd position also has 5 choices {1, 3, 5, 7, 9}. Therefore, there are 5 possibilities for every position. Considering d to be the number of digits in any number satisfying the condition and D to be the number of digits in N, following observations can be made:
- Case 1: If d < D, then the count of total numbers consisting of d digits satisfying the condition is 5d as every number has 5 choices and numbers made will all be less than N.
- Case 2: If D = d, then the count of total numbers satisfying the condition of length d is 5d . But the numbers exceeding N needs to be discarded, which is determined by the following:
- For even places, if the digit in pth place is x, then (5 — (x / 2 + 1)) * 5(D — p) numbers are greater than N.
- For odd places, if the digit in pth place is x, then (5 — (x + 1) / 2) * 5(D — p) numbers will be greater than N.
Follow the steps below to solve the problem:
- Define a function countNumberUtill() for count the numbers from the range [1, N], satisfying the condition, where N is a natural number.
- Initialize an integer variable, count and vector digits to store the digits of the integer N.
- Traverse over all the digits of given number, i.e. from 1 to D, and perform the following:
- Store the 5i in variable, say res.
- Traverse from p = 1 to p = D and perform the following:
- Initialize a variable x and store x = digits[p] in it.
- If p is even, then subtract (5 — (x / 2 + 1)) * 5(D— p) from res.
- Otherwise, subtract (5 — (x + 1) / 2) * 5(D — p) from res.
- Add res to the count.
- Return the count.
- Print countNumberUtill(R) — countNumberUtill(L – 1) as the required answer.
Below is the implementation of the above approach:
C++
// C++ program to implement // the above approach #include <bits/stdc++.h> using namespace std; #define ll long long // Function to calculate 5^p ll getPower( int p) { // Stores the result ll res = 1; // Multiply 5 p times while (p--) { res *= 5; } // Return the result return res; } // Function to count all numbers upto N // having odd digits at odd places and // even digits at even places ll countNumbersUtil(ll N) { // Stores the count ll count = 0; // Stores the digits of N vector< int > digits; // Insert the digits of N while (N) { digits.push_back(N % 10); N /= 10; } // Reverse the vector to arrange // the digits from first to last reverse(digits.begin(), digits.end()); // Stores count of digits of n int D = digits.size(); for ( int i = 1; i <= D; i++) { // Stores the count of numbers // with i digits ll res = getPower(i); // If the last digit is reached, // subtract numbers eceeding range if (i == D) { // Iterate over all the places for ( int p = 1; p <= D; p++) { // Stores the digit in the pth place int x = digits[p - 1]; // Stores the count of numbers // having a digit greater than x // in the p-th position ll tmp = 0; // Calculate the count of numbers // exceeding the range if p is even if (p % 2 == 0) { tmp = (5 - (x / 2 + 1)) * getPower(D - p); } // Calculate the count of numbers // exceeding the range if p is odd else { tmp = (5 - (x + 1) / 2) * getPower(D - p); } // Substract the count of numbers // exceeding the range from total count res -= tmp; // If the parity of p and the // parity of x are not same if (p % 2 != x % 2) { break ; } } } // Add count of numbers having i digits // and satisfies the given conditions count += res; } // Return the total count of numbers till n return count; } // Function to calculate the count of numbers // from given range having odd digits places // and even digits at even places void countNumbers(ll L, ll R) { // Count of numbers in range [L, R] = // Count of numbers till R - cout << (countNumbersUtil(R) // Count of numbers till (L-1) - countNumbersUtil(L - 1)) << endl; } // Driver Code int main() { ll L = 128, R = 162; countNumbers(L, R); return 0; } |
Java
// Java program to implement // the above approach import java.util.*; import java.util.Vector; import java.util.Collections; class GFG{ // Function to calculate 5^p static int getPower( int p) { // Stores the result int res = 1 ; // Multiply 5 p times while (p > 0 ) { res *= 5 ; p--; } // Return the result return res; } // Function to count all numbers upto N // having odd digits at odd places and // even digits at even places static int countNumbersUtil( int N) { // Stores the count int count = 0 ; // Stores the digits of N Vector<Integer> digits = new Vector<Integer>(); // Insert the digits of N while (N > 0 ) { digits.add(N % 10 ); N /= 10 ; } // Reverse the vector to arrange // the digits from first to last Collections.reverse(digits); // Stores count of digits of n int D = digits.size(); for ( int i = 1 ; i <= D; i++) { // Stores the count of numbers // with i digits int res = getPower(i); // If the last digit is reached, // subtract numbers eceeding range if (i == D) { // Iterate over all the places for ( int p = 1 ; p <= D; p++) { // Stores the digit in the pth place int x = digits.get(p - 1 ); // Stores the count of numbers // having a digit greater than x // in the p-th position int tmp = 0 ; // Calculate the count of numbers // exceeding the range if p is even if (p % 2 == 0 ) { tmp = ( 5 - (x / 2 + 1 )) * getPower(D - p); } // Calculate the count of numbers // exceeding the range if p is odd else { tmp = ( 5 - (x + 1 ) / 2 ) * getPower(D - p); } // Substract the count of numbers // exceeding the range from total count res -= tmp; // If the parity of p and the // parity of x are not same if (p % 2 != x % 2 ) { break ; } } } // Add count of numbers having i digits // and satisfies the given conditions count += res; } // Return the total count of numbers till n return count; } // Function to calculate the count of numbers // from given range having odd digits places // and even digits at even places static void countNumbers( int L, int R) { // Count of numbers in range [L, R] = // Count of numbers till R - System.out.println(countNumbersUtil(R) - // Count of numbers till (L-1) countNumbersUtil(L - 1 )); } // Driver Code public static void main(String args[]) { int L = 128 , R = 162 ; countNumbers(L, R); } } // This code is contributed by ipg2016107 |
Python3
# Python3 program to implement # the above approach # Function to calculate 5^p def getPower(p) : # Stores the result res = 1 # Multiply 5 p times while (p) : res * = 5 p - = 1 # Return the result return res # Function to count anumbers upto N # having odd digits at odd places and # even digits at even places def countNumbersUtil(N) : # Stores the count count = 0 # Stores the digits of N digits = [] # Insert the digits of N while (N) : digits.append(N % 10 ) N / / = 10 # Reverse the vector to arrange # the digits from first to last digits.reverse() # Stores count of digits of n D = len (digits) for i in range ( 1 , D + 1 , 1 ) : # Stores the count of numbers # with i digits res = getPower(i) # If the last digit is reached, # subtract numbers eceeding range if (i = = D) : # Iterate over athe places for p in range ( 1 , D + 1 , 1 ) : # Stores the digit in the pth place x = digits[p - 1 ] # Stores the count of numbers # having a digit greater than x # in the p-th position tmp = 0 # Calculate the count of numbers # exceeding the range if p is even if (p % 2 = = 0 ) : tmp = (( 5 - (x / / 2 + 1 )) * getPower(D - p)) # Calculate the count of numbers # exceeding the range if p is odd else : tmp = (( 5 - (x + 1 ) / / 2 ) * getPower(D - p)) # Substract the count of numbers # exceeding the range from total count res - = tmp # If the parity of p and the # parity of x are not same if (p % 2 ! = x % 2 ) : break # Add count of numbers having i digits # and satisfies the given conditions count + = res # Return the total count of numbers tin return count # Function to calculate the count of numbers # from given range having odd digits places # and even digits at even places def countNumbers(L, R) : # Count of numbers in range [L, R] = # Count of numbers tiR - print (countNumbersUtil(R) # Count of numbers ti(L-1) - countNumbersUtil(L - 1 )) # Driver Code L = 128 R = 162 countNumbers(L, R) # This code is contributed by code_hunt |
C#
// C# program for // the above approach using System; using System.Collections.Generic; class GFG{ // Function to calculate 5^p static int getPower( int p) { // Stores the result int res = 1; // Multiply 5 p times while (p > 0) { res *= 5; p--; } // Return the result return res; } // Function to count all numbers upto N // having odd digits at odd places and // even digits at even places static int countNumbersUtil( int N) { // Stores the count int count = 0; // Stores the digits of N List< int > digits = new List< int >(); // Insert the digits of N while (N > 0) { digits.Add(N % 10); N /= 10; } // Reverse the vector to arrange // the digits from first to last digits.Reverse(); // Stores count of digits of n int D = digits.Count; for ( int i = 1; i <= D; i++) { // Stores the count of numbers // with i digits int res = getPower(i); // If the last digit is reached, // subtract numbers eceeding range if (i == D) { // Iterate over all the places for ( int p = 1; p <= D; p++) { // Stores the digit in the pth place int x = digits[p - 1]; // Stores the count of numbers // having a digit greater than x // in the p-th position int tmp = 0; // Calculate the count of numbers // exceeding the range if p is even if (p % 2 == 0) { tmp = (5 - (x / 2 + 1)) * getPower(D - p); } // Calculate the count of numbers // exceeding the range if p is odd else { tmp = (5 - (x + 1) / 2) * getPower(D - p); } // Substract the count of numbers // exceeding the range from total count res -= tmp; // If the parity of p and the // parity of x are not same if (p % 2 != x % 2) { break ; } } } // Add count of numbers having i digits // and satisfies the given conditions count += res; } // Return the total count of numbers till n return count; } // Function to calculate the count of numbers // from given range having odd digits places // and even digits at even places static void countNumbers( int L, int R) { // Count of numbers in range [L, R] = // Count of numbers till R - Console.WriteLine(countNumbersUtil(R) - // Count of numbers till (L-1) countNumbersUtil(L - 1)); } // Driver Code public static void Main(String[] args) { int L = 128, R = 162; countNumbers(L, R); } } // This code is contributed by jana_sayantan |
7
Time Complexity: O(N2), where N is the number of digits in R
Auxiliary Space: O(N)
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.