# 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.

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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

```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 4``void` `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 functions``int` `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 4``import` `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[``0``] = ``""``;` `        ``// 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 4``def` `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 Code``for` `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 4``using` `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.`

## PHP

 ``

## 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 n``int` `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 form``vector<``int``> decToBinary(``int` `n, ``int` `size)``{``    ``vector<``int``> binaryNum(size + 1);` `    ``int` `i = 0;``    ``while` `(n > 0) {``        ``binaryNum[i] = n % 2;``        ``n = (n >> 1);``        ``i++;``    ``}` `    ``return` `binaryNum;``}` `// Driver Code``signed` `main()``{``    ``for` `(``int` `n = 1; n < 16; n++) {``        ``int` `hp2 = highestPowerof2(n + 1);` `        ``int` `howMany = n - hp2 + 1;` `        ``vector<``int``> 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```