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

• Difficulty Level : Medium
• Last Updated : 07 Jul, 2022

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 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'``;` `    ``}` `}`

## Java

 `/*package whatever //do not write package name here */` `import` `java.io.*;`   `class` `GFG` `{`   `  ``// Java program for the above approach`   `  ``// function to find highest power of 2` `  ``// less than or equal to n` `  ``static` `long` `highestPowerof2(``int` `n)` `  ``{` `    ``if` `(n < ``1``)` `      ``return` `0``;`   `    ``long` `res = ``1``;`   `    ``for` `(``int` `i = ``0``; i < ``32``; i++) {` `      ``long` `curr = ``1` `<< i;`   `      ``if` `(curr > n)` `        ``break``;`   `      ``res = curr;` `    ``}`   `    ``return` `res;` `  ``}`   `  ``// function to convert decimal to binary form` `  ``static` `long``[] decToBinary(``long` `n, ``int` `size)` `  ``{` `    ``long``[] binaryNum = ``new` `long``[size+``1``];`   `    ``int` `i = ``0``;` `    ``while` `(n > ``0``) {` `      ``binaryNum[i] = n % ``2``;` `      ``n = (n >> ``1``);` `      ``i = i + ``1``;` `    ``}` `    ``return` `binaryNum;` `  ``}`   `  ``/* Driver program to test above function*/` `  ``public` `static` `void` `main(String args[])` `  ``{` `    ``for` `(``int` `n = ``1``; n < ``16``; n++) {` `      ``long` `hp2 = highestPowerof2(n + ``1``);`   `      ``long` `howMany = n - hp2 + ``1``;`   `      ``long``[] arr = decToBinary(howMany, (``int``)Math.floor(Math.log(hp2 - ``1``)/Math.log(``2``)));`   `      ``for` `(``int` `i = (``int``)Math.floor(Math.log(hp2 - ``1``)/Math.log(``2``)); i >= ``0``; i--) {` `        ``if` `(arr[i] > ``0``)` `          ``System.out.print(``4``);` `        ``else` `          ``System.out.print(``3``);` `      ``}` `      ``System.out.println();` `    ``}` `  ``}` `}`   `// This code is contributed by shinjanpatra.`

## Python3

 `# Python3 program for the above approach`   `# function to find highest power of 2` `# less than or equal to n` `from` `math ``import` `floor, log2`   `def` `highestPowerof2(n):`   `    ``if` `(n < ``1``):` `        ``return` `0`   `    ``res ``=` `1`   `    ``for` `i ``in` `range``(``32``):` `        ``curr ``=` `1` `<< i`   `        ``if` `(curr > n):` `            ``break`   `        ``res ``=` `curr`   `    ``return` `res`   `# function to convert decimal to binary form` `def` `decToBinary(n, size):`   `    ``binaryNum ``=` `[``0` `for` `i ``in` `range``(size``+``1``)]`   `    ``i ``=` `0` `    ``while` `(n > ``0``):` `        ``binaryNum[i] ``=` `n ``%` `2` `        ``n ``=` `(n >> ``1``)` `        ``i ``=` `i ``+` `1` `    `  `    ``return` `binaryNum`   `# Driver Code` `for` `n ``in` `range``(``1``,``16``):` `    ``hp2 ``=` `highestPowerof2(n ``+` `1``)`   `    ``howMany ``=` `n ``-` `hp2 ``+` `1`   `    ``arr ``=` `decToBinary(howMany, floor(log2(hp2 ``-` `1``)))`   `    ``for` `i ``in` `range``(floor(log2(hp2 ``-` `1``)),``-``1``,``-``1``):` `        ``if` `(arr[i]):` `            ``print``(``4``,end``=``"")` `        ``else``:` `            ``print``(``3``,end``=``"")` `    `  `    ``print``()`   `# This code is contributed by Shinjanpatra`

## C#

 `// C# implementation of the approach` `using` `System;`   `class` `GFG` `{`   `  ``// function to find highest power of 2` `  ``// less than or equal to n` `  ``static` `long` `highestPowerof2(``int` `n)` `  ``{` `    ``if` `(n < 1)` `      ``return` `0;`   `    ``long` `res = 1;`   `    ``for` `(``int` `i = 0; i < 32; i++) {` `      ``long` `curr = 1 << i;`   `      ``if` `(curr > n)` `        ``break``;`   `      ``res = curr;` `    ``}`   `    ``return` `res;` `  ``}`   `  ``// function to convert decimal to binary form` `  ``static` `long``[] decToBinary(``long` `n, ``int` `size)` `  ``{` `    ``long``[] binaryNum = ``new` `long``[size+1];`   `    ``int` `i = 0;` `    ``while` `(n > 0) {` `      ``binaryNum[i] = n % 2;` `      ``n = (n >> 1);` `      ``i = i + 1;` `    ``}` `    ``return` `binaryNum;` `  ``}`   `  ``/* Driver program to test above function*/` `  ``public` `static` `void` `Main(``string``[] args)` `  ``{` `    ``for` `(``int` `n = 1; n < 16; n++) {` `      ``long` `hp2 = highestPowerof2(n + 1);`   `      ``long` `howMany = n - hp2 + 1;`   `      ``long``[] arr = decToBinary(howMany, (``int``)Math.Floor(Math.Log(hp2 - 1)/Math.Log(2)));`   `      ``for` `(``int` `i = (``int``)Math.Floor(Math.Log(hp2 - 1)/Math.Log(2)); i >= 0; i--) {` `        ``if` `(arr[i] > 0)` `          ``Console.Write(4);` `        ``else` `          ``Console.Write(3);` `      ``}` `      ``Console.WriteLine();` `    ``}` `  ``}` `}`   `// This code is contributed by  phasing17`

## Javascript

 `// JavaScript program for the above approach`   `// function to find highest power of 2` `// less than or equal to n` `function` `highestPowerof2(n)` `{` `    ``if` `(n < 1)` `        ``return` `0;`   `    ``let res = 1;`   `    ``for` `(let i = 0; i < 32; i++) {` `        ``let curr = 1 << i;`   `        ``if` `(curr > n)` `            ``break``;`   `        ``res = curr;` `    ``}`   `    ``return` `res;` `}`   `// function to convert decimal to binary form` `function` `decToBinary(n, size)` `{` `    ``let binaryNum = ``new` `Array(size+1);`   `    ``let i = 0;` `    ``while` `(n > 0) {` `        ``binaryNum[i] = n % 2;` `        ``n = (n >> 1);` `        ``i = i + 1;` `    ``}` `    ``return` `binaryNum;` `}`   `// Driver Code` `for` `(let n = 1; n < 16; n++) {` `    ``let hp2 = highestPowerof2(n + 1);`   `    ``let howMany = n - hp2 + 1;`   `    ``let arr = decToBinary(howMany, Math.floor(Math.log2(hp2 - 1)));`   `    ``for` `(let i = Math.floor(Math.log2(hp2 - 1)); i >= 0; i--) {` `        ``if` `(arr[i])` `            ``document.write(4);` `        ``else` `            ``document.write(3);` `    ``}` `    ``document.write(``"\n"``);` `}`   `// The code is contributed by Nidhi goel`

Output:

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