Find the number of digits in the nth number constructed by using 6, 1, 4 and 9 as the only digits in the ascending order.

First few numbers constructed by using only 6, 1, 4 and 9 as digits in the ascending order would be: 1, 6, 4,

9, 11, 14, 16, 19, 41, 44, 46, 49, 61, 64, 66, 69, 91, 94, 96, 99, 111, 114, 116, 119 and so on.

Examples:

Input : 6 Output : 2 6th digit of the series is 14 which has 2 digits. Input : 21 Output : 3 21st digit of the series is 111 which has 3 digits.

**Simple Approach:** This is a brute force approach.

1. Initialize a number to 1 and a counter to 0.

2. Check if the initialized number has only 6, 1, 4 or 9 as it’s digits.

3. If it has only the mentioned digits then increase the counter by 1.

4. Increase the number and repeat the above steps until the counter is less than n.

**Note:** The value of n could be large and hence this approach can’t work as it’s not time efficient.

**Efficient Approach:** You can calculate the number of k digit numbers in O (1) time and they will be always be power of 4, for instance number of 1 digit numbers in the series would be 4, number of 2 digit numbers in the series would be 16 and so on.

1. Count all subsequent k digit numbers and keep adding them to a sum.

2. Break the loop when sum is greater than or equal to n.

3. Maintain a counter to keep track of the number of digits.

4. The value of the counter at the break of the loop will indicate the answer.

[sourcecode language=”CPP”]

// CPP program to count number of digits

// in n-th number made of given four digits.

#include <bits/stdc++.h>

using namespace std;

// Efficient function to calculate number

// of digits in the nth number constructed

// by using 6, 1, 4 and 9 as digits in the

// ascending order.

ll number_of_digits(ll n)

{

ll i, res, sum = 0;

// Number of digits increase after

// every i-th number where i increases in

// powers of 4.

for (i = 4, res = 1;; i *= 4, res++) {

sum += i;

if (sum >= n)

break;

}

return res;

}

// Driver Program.

int main()

{

ll n = 21;

cout << number_of_digits(n) << endl;

return 0;

}

[/sourcecode]

**Note:** Since n could be really large we have used boost library, to know more about boost library give this article a read: http://gdevtest.geeksforgeeks.org/advanced-c-boost-library/

## Recommended Posts:

- Nth number made up of odd digits only
- Find the n-th number made of even digits only
- Finding n-th number made of prime digits (2, 3, 5 and 7) only
- Smallest multiple of a given number made of digits 0 and 9 only
- Check whether product of digits at even places is divisible by sum of digits at odd place of a number
- Minimum number of digits to be removed so that no two consecutive digits are same
- Find the Largest number with given number of digits and sum of digits
- Find smallest number with given number of digits and sum of digits
- Smallest number with given sum of digits and sum of square of digits
- Print a number strictly less than a given number such that all its digits are distinct.
- Count number of digits after decimal on dividing a number
- Find maximum number that can be formed using digits of a given number
- Number of digits to be removed to make a number divisible by 3
- Find the smallest number whose digits multiply to a given number n
- Find count of digits in a number that divide the number

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.