Find n’th number in a number system with only 3 and 4

• Difficulty Level : Medium
• Last Updated : 16 Apr, 2021

Given a number system with only 3 and 4. Find the nth number in the number system. First few numbers in the number system are: 3, 4, 33, 34, 43, 44, 333, 334, 343, 344, 433, 434, 443, 444, 3333, 3334, 3343, 3344, 3433, 3434, 3443, 3444, …
Source: Zoho Interview

We can generate all numbers with i digits using the numbers with (i-1) digits. The idea is to first add a ‘3’ as prefix in all numbers with (i-1) digit, then add a ‘4’. For example, the numbers with 2 digits are 33, 34, 43 and 44. The numbers with 3 digits are 333, 334, 343, 344, 433, 434, 443 and 444 which can be generated by first adding a 3 as prefix, then 4.
Following are detailed steps.

1) Create an array 'arr[]' of strings size n+1.
2) Initialize arr as empty string. (Number with 0 digits)
3) Do following while array size is smaller than or equal to n
.....a) Generate numbers by adding a 3 as prefix to the numbers generated
in previous iteration.  Add these numbers to arr[]
.....a) Generate numbers by adding a 4 as prefix to the numbers generated
in previous iteration. Add these numbers to arr[]

Thanks to kaushik Lele for suggesting this idea in a comment here. Following is C++ implementation for the same.

C++

 // C++ program to find n'th number// in a number system with// only 3 and 4#include using namespace std; // Function to find n'th number// in a number system with only// 3 and 4void find(int n){       // An array of strings to    // store first n numbers. arr[i]    // stores i'th number    string arr[n + 1];       // arr stores the empty string (String    // with 0 digits)    arr = "";     // size indicates number of    // current elements in arr[]. m    // indicates number of elements    // added to arr[] in    // previous iteration.    int size = 1, m = 1;     // Every iteration of following    // loop generates and adds    // 2*m numbers to arr[] using     // the m numbers generated in    // previous iteration.    while (size <= n) {               // Consider all numbers added        // in previous iteration,        // add a prefix "3" to them and        // add new numbers to        // arr[]        for (int i = 0; i < m && (size + i) <= n; i++)            arr[size + i] = "3" + arr[size - m + i];         // Add prefix "4" to numbers        // of previous iteration        // and add new numbers to arr[]        for (int i = 0; i < m && (size + m + i) <= n; i++)            arr[size + m + i] = "4" + arr[size - m + i];         // Update no. of elements added in previous        // iteration        m = m << 1; // Or m = m*2;         // Update size        size = size + m;    }    cout << arr[n] << endl;} // Driver program to test above functionsint main(){    for (int i = 1; i < 16; i++)        find(i);    return 0;}

Java

 // Java program to find n'th number in a number system with// only 3 and 4import java.io.*; class GFG {    // Function to find n'th number in a number system with    // only 3 and 4    static void find(int n)    {        // An array of strings to store first n numbers.        // arr[i] stores i'th number        String[] arr = new String[n + 1];         // arr stores the empty string (String with 0        // digits)        arr = "";         // size indicates number of current elements in        // arr[], m indicates number of elements added to        // arr[] in previous iteration        int size = 1, m = 1;         // Every iteration of following loop generates and        // adds 2*m numbers to arr[] using the m numbers        // generated in previous iteration        while (size <= n) {            // Consider all numbers added in previous            // iteration, add a prefix "3" to them and add            // new numbers to arr[]            for (int i = 0; i < m && (size + i) <= n; i++)                arr[size + i] = "3" + arr[size - m + i];             // Add prefix "4" to numbers of previous            // iteration and add new numbers to arr[]            for (int i = 0; i < m && (size + m + i) <= n;                 i++)                arr[size + m + i] = "4" + arr[size - m + i];             // Update no. of elements added in previous            // iteration            m = m << 1; // Or m = m*2;             // Update size            size = size + m;        }        System.out.println(arr[n]);    }     // Driver program    public static void main(String[] args)    {        for (int i = 0; i < 16; i++)            find(i);    }} // Contributed by Pramod Kumar

Python3

 # Python3 program to find n'th# number in a number system# with only 3 and 4 # Function to find n'th number in a# number system with only 3 and 4def find(n):         # An array of strings to store    # first n numbers. arr[i] stores    # i'th number    arr = [''] * (n + 1);         # arr = ""; # arr stores    # the empty string (String with 0 digits)     # size indicates number of current    # elements in arr[]. m indicates    # number of elements added to arr[]    # in previous iteration.    size = 1;    m = 1;     # Every iteration of following    # loop generates and adds 2*m    # numbers to arr[] using the m    # numbers generated in previous    # iteration.    while (size <= n):                 # Consider all numbers added        # in previous iteration, add        # a prefix "3" to them and        # add new numbers to arr[]        i = 0;        while(i < m and (size + i) <= n):            arr[size + i] = "3" + arr[size - m + i];            i += 1;         # Add prefix "4" to numbers of        # previous iteration and add        # new numbers to arr[]        i = 0;        while(i < m and (size + m + i) <= n):            arr[size + m + i] = "4" + arr[size - m + i];            i += 1;         # Update no. of elements added        # in previous iteration        m = m << 1; # Or m = m*2;         # Update size        size = size + m;    print(arr[n]); # Driver Codefor i in range(1, 16):    find(i); # This code is contributed by mits

C#

 // C# program to find n'th number in a// number system with only 3 and 4using System; class GFG {         // Function to find n'th number in a    // number system with only 3 and 4    static void find(int n)    {                 // An array of strings to store first        // n numbers. arr[i] stores i'th number        String[] arr = new String[n + 1];                 // arr stores the empty string        // (String with 0 digits)        arr = "";         // size indicates number of current        // elements in arr[], m indicates        // number of elements added to arr[]        // in previous iteration        int size = 1, m = 1;         // Every iteration of following loop        // generates and adds 2*m numbers to        // arr[] using the m numbers generated        // in previous iteration        while (size <= n)        {            // Consider all numbers added in            // previous iteration, add a prefix            // "3" to them and add new numbers            // to arr[]            for (int i = 0; i < m &&                             (size + i) <= n; i++)                                              arr[size + i] = "3" +                               arr[size - m + i];             // Add prefix "4" to numbers of            // previous iteration and add new            // numbers to arr[]            for (int i = 0; i < m &&                          (size + m + i) <= n; i++)                                           arr[size + m + i] = "4" +                                  arr[size - m + i];             // Update no. of elements added            // in previous iteration            m = m << 1; // Or m = m*2;             // Update size            size = size + m;        }                 Console.WriteLine(arr[n]);    }         // Driver program    public static void Main ()    {        for (int i = 0; i < 16; i++)            find(i);    }} // This code is contributed by Sam007.



Javascript



Output:

3
4
33
34
43
44
333
334
343
344
433
434
443
444
3333

Better Approach (using bits) :

This idea was suggested by Arjun J (https://auth.geeksforgeeks.org/user/camsboyfriend/profile).

The idea here is, as we are going to deal with only two numbers, i.e., 3 and 4, so we can just compare them with binary numbers.

Explanation :

1)  3   -  0     (0)
2)  4   -  1     (1)

3)  33  -  00    (0)
4)  34  -  01    (1)
5)  43  -  10    (2)
6)  44  -  11    (3)

7)  333 -  000   (0)
8)  334 -  001   (1)
9)  343 -  010   (2)
10) 344 -  011   (3)
11) 433 -  100   (4)
12) 434 -  101   (5)
13) 443 -  110   (6)
14) 444 -  111   (7)
15) 3333 - 1000  (8)

Here we can note that

1. Every (n – 1)’th number gets a new digit where n is a power of 2
2. Whenever a new digit is added we start the counting binary numbers from 0.
3. 0 in binary form corresponds to 3 in our number system and similarly corresponds to 4.

Below is the C++ implementation for the same :

C++

 // CPP program for the above approach#include using namespace std; // function to find highest power of 2// less than or equal to nint highestPowerof2(unsigned int n){    if (n < 1)        return 0;     int res = 1;     for (int i = 0; i < 8 * sizeof(unsigned int); i++) {        int curr = 1 << i;         if (curr > n)            break;         res = curr;    }     return res;} // function to convert decimal to binary formvector decToBinary(int n, int size){    vector binaryNum(size + 1);     int i = 0;    while (n > 0) {        binaryNum[i] = n % 2;        n = (n >> 1);        i++;    }     return binaryNum;} // Driver Codesigned main(){    for (int n = 1; n < 16; n++) {        int hp2 = highestPowerof2(n + 1);         int howMany = n - hp2 + 1;         vector arr            = decToBinary(howMany, log2(hp2 - 1));         for (int i = log2(hp2 - 1); i >= 0; i--) {            if (arr[i])                cout << 4;            else                cout << 3;        }        cout << '\n';    }}

Output:

3
4
33
34
43
44
333
334
343
344
433
434
443
444
3333