Open In App

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

Improve
Improve
Like Article
Like
Save
Share
Report

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[0] 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 the C++ implementation for the same.  

C++




// C++ program to find n'th number
// in a number system with
// only 3 and 4
#include <iostream>
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[0] 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;
    }
    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[0] 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[0] = ""; # arr[0] 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[0] 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;
        }
         
        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




<script>
// javascript 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
function find(n)
{
 
    // An array of strings to store first n numbers.
    // arr[i] stores i'th number
    var arr = Array.from({length: n + 1}, (_, i) => " ");
 
    // arr[0] 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
    var 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 (var 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 (var 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;
    }
    document.write(arr[n]+"<br>");
}
 
// Driver program
for (i = 0; i < 16; i++)
    find(i);
 
// This code is contributed by Amit Katiyar
</script>


PHP




<?php
// PHP 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
function find($n)
{
    // An array of strings to store
    // first n numbers. arr[i] stores
    // i'th number
    $arr = array_fill(0, $n + 1, "");
     
    // $arr[0] = ""; // arr[0] 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[]
        for ($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 ($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;
    }
    echo $arr[$n] . "\n";
}
 
// Driver Code
for ($i = 1; $i < 16; $i++)
    find($i);
 
// This code is contributed by mits
?>


Output: 
 

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

Time Complexity: O(Nlog(N)) as the program uses a while loop to generate and add 2*m numbers to the array in each iteration, where m is the number of elements added to the array in the previous iteration.

Auxiliary Space: O(N) because the program creates an array of size n+1 to store the first n numbers in the number system with only 3 and 4

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 <bits/stdc++.h>
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

Time Complexity: O(log(n))

Auxiliary Space: O(Size), where size represents the size of the decimal number in its binary representation.



Last Updated : 07 Jan, 2024
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads