 Open in App
Not now

# Finding n-th number made of prime digits (2, 3, 5 and 7) only

• Difficulty Level : Hard
• Last Updated : 03 Feb, 2023

Given a number ‘n‘, find the nth number whose each digit is a prime number i.e 2, 3, 5, 7. . . In other words, find the nth number of this sequence. 2, 3, 5, 5, 22, 23……
Given that the nth number such found will be less than equal to 10^18

Examples :

Input: 10
Output: 3
Explanation: 2, 3, 5, 7, 22, 23, 25, 27, 32, 33

Input: 21
Output: 222

## Finding the n-th number made of prime digits (2, 3, 5, and 7) using Mathematics:

There are four prime digits 2, 3, 5, and 7. The first observation is that the number of numbers of x length and made of prime digits are 4x because for each position you have 4 choices so the total number is 4^x. So the total count of such numbers whose length is = 1 to len (i.e. 2 or 3 or more) will be 4*((4len – 1)/3). (This is the sum of G.P with first term 4 and common ratio 4)

Follow the steps below to solve the problem:

• First finds the number of digits in the n-th number using the above observation. Start from len = 0 and keep incrementing it while the value of it is smaller than 4*((4len – 1)/3).
• Now we know the number of digits in the n-th number. We also know the count of numbers with (len-1) digits. Let this count be prev_count. Now one by one find digits in our result.
• First, fix 2 at the ith place (assuming all the places up to i-1 are already filled), we have 4(len – i) numbers possible and to check if 2 is the right candidate or not check if the count of numbers after putting 2 is greater than or equal to n or not. If it is true then 2 is the right candidate if this is not true this means if we fix 2 at the ith place only prev_count + 4(len-i) numbers can be covered.
• So increase prev_count by 4(len-i) and repeat this step for 3 checks if 3 fits at ith place or not. If not go for 5. If 5 also does not fit, go for 7. It is guaranteed that 7 will fit it if 2, 3, and 5 do not fit because we are sure that the length of the nth such number is len only.

Below is the implementation of the above steps:

## C++

 `// C++ implementation for finding nth number``// made of prime digits only``#include ``using` `namespace` `std;` `// Prints n-th number where each digit is a``// prime number``void` `nthprimedigitsnumber(``long` `long` `n)``{``    ``// Finding the length of n-th number``    ``long` `long` `len = 1;` `    ``// Count of numbers with len-1 digits``    ``long` `long` `prev_count = 0;``    ``while` `(``true``) {``        ``// Count of numbers with i digits``        ``long` `long` `curr_count = prev_count + ``pow``(4, len);` `        ``// if i is the length of such number``        ``// then n<4*(4^(i-1)-1)/3 and n>= 4*(4 ^ i-1)/3``        ``// if a valid i is found break the loop``        ``if` `(prev_count < n && curr_count >= n)``            ``break``;` `        ``// check for i + 1``        ``len++;` `        ``prev_count = curr_count;``    ``}` `    ``// Till now we have covered 'prev_count' numbers` `    ``// Finding ith digit at ith place``    ``for` `(``int` `i = 1; i <= len; i++) {``        ``// j = 1 means 2 j = 2 means ...j = 4 means 7``        ``for` `(``long` `long` `j = 1; j <= 4; j++) {``            ``// if prev_count + 4 ^ (len-i) is less``            ``// than n, increase prev_count by 4^(x-i)``            ``if` `(prev_count + ``pow``(4, len - i) < n)``                ``prev_count += ``pow``(4, len - i);` `            ``// else print the ith digit and break``            ``else` `{``                ``if` `(j == 1)``                    ``cout << ``"2"``;``                ``else` `if` `(j == 2)``                    ``cout << ``"3"``;``                ``else` `if` `(j == 3)``                    ``cout << ``"5"``;``                ``else` `if` `(j == 4)``                    ``cout << ``"7"``;``                ``break``;``            ``}``        ``}``    ``}``    ``cout << endl;``}` `// Driver function``int` `main()``{``    ``nthprimedigitsnumber(10);``    ``nthprimedigitsnumber(21);``    ``return` `0;``}`

## Java

 `// Java implementation for finding nth number``// made of prime digits only` `import` `static` `java.lang.Math.pow;` `class` `Test {` `    ``// Prints n-th number where each digit is a``    ``// prime number``    ``static` `void` `nthprimedigitsnumber(``long` `n)``    ``{``        ``// Finding the length of n-th number``        ``long` `len = ``1``;` `        ``// Count of numbers with len-1 digits``        ``long` `prev_count = ``0``;``        ``while` `(``true``) {``            ``// Count of numbers with i digits``            ``long` `curr_count = (``long``)(prev_count + pow(``4``, len));` `            ``// if i is the length of such number``            ``// then n<4*(4^(i-1)-1)/3 and n>= 4*(4 ^ i-1)/3``            ``// if a valid i is found break the loop``            ``if` `(prev_count < n && curr_count >= n)``                ``break``;` `            ``// check for i + 1``            ``len++;` `            ``prev_count = curr_count;``        ``}` `        ``// Till now we have covered 'prev_count' numbers` `        ``// Finding ith digit at ith place``        ``for` `(``int` `i = ``1``; i <= len; i++) {``            ``// j = 1 means 2 j = 2 means ...j = 4 means 7``            ``for` `(``long` `j = ``1``; j <= ``4``; j++) {``                ``// if prev_count + 4 ^ (len-i) is less``                ``// than n, increase prev_count by 4^(x-i)``                ``if` `(prev_count + pow(``4``, len - i) < n)``                    ``prev_count += pow(``4``, len - i);` `                ``// else print the ith digit and break``                ``else` `{``                    ``if` `(j == ``1``)``                        ``System.out.print(``"2"``);``                    ``else` `if` `(j == ``2``)``                        ``System.out.print(``"3"``);``                    ``else` `if` `(j == ``3``)``                        ``System.out.print(``"5"``);``                    ``else` `if` `(j == ``4``)``                        ``System.out.print(``"7"``);``                    ``break``;``                ``}``            ``}``        ``}``        ``System.out.println();``    ``}` `    ``// Driver method``    ``public` `static` `void` `main(String args[])``    ``{``        ``nthprimedigitsnumber(``10``);``        ``nthprimedigitsnumber(``21``);``    ``}``}`

## Python3

 `# Python3 implementation for``# finding nth number made of``# prime digits only``import` `math` `# Prints n-th number where``# each digit is a prime number``def` `nthprimedigitsnumber(n):``    ` `    ``# Finding the length``    ``# of n-th number``    ``len` `=` `1``;` `    ``# Count of numbers``    ``# with len-1 digits``    ``prev_count ``=` `0``;``    ``while``(``1``):``        ` `        ``# Count of numbers``        ``# with i digits``        ``curr_count ``=` `(prev_count ``+``                      ``math.``pow``(``4``, ``len``));` `        ``# if i is the length of such``        ``# number then n<4*(4^(i-1)-1)/3``        ``# and n>= 4*(4 ^ i-1)/3 if a valid``        ``# i is found break the loop``        ``if` `(prev_count < n ``and``            ``curr_count >``=` `n):``            ``break``;` `        ``# check for i + 1``        ``len` `+``=` `1``;` `        ``prev_count ``=` `curr_count;` `    ``# Till now we have covered``    ``# 'prev_count' numbers` `    ``# Finding ith digit at ith place``    ``for` `i ``in` `range` `(``1``, ``len` `+` `1``):``        ` `        ``# j = 1 means 2 j = 2``        ``# means ...j = 4 means 7``        ``for` `j ``in` `range``(``1``, ``5``):``            ` `            ``# if prev_count + 4 ^ (len-i)``            ``# is less than n, increase``            ``# prev_count by 4^(x-i)``            ``if` `(prev_count ``+` `pow``(``4``, ``len` `-` `i) < n):``                ``prev_count ``+``=` `pow``(``4``, ``len` `-` `i);` `            ``# else print the ith``            ``# digit and break``            ``else``:``                ``if` `(j ``=``=` `1``):``                    ``print``(``"2"``, end ``=` `"");``                ``elif` `(j ``=``=` `2``):``                    ``print``(``"3"``, end ``=` `"");``                ``elif` `(j ``=``=` `3``):``                    ``print``(``"5"``, end ``=` `"");``                ``elif` `(j ``=``=` `4``):``                    ``print``(``"7"``, end ``=` `"");``                ``break``;``    ``print``();` `# Driver Code``nthprimedigitsnumber(``10``);``nthprimedigitsnumber(``21``);` `# This code is contributed by mits`

## C#

 `// C# implementation for finding nth``// number made of prime digits only``using` `System;` `public` `class` `GFG {``    ` `    ``// Prints n-th number where each``    ``// digit is a prime number``    ``static` `void` `nthprimedigitsnumber(``long` `n)``    ``{``        ``// Finding the length of n-th number``        ``long` `len = 1;` `        ``// Count of numbers with len-1 digits``        ``long` `prev_count = 0;``        ``while` `(``true``) {``            ` `            ``// Count of numbers with i digits``            ``long` `curr_count = (``long``)(prev_count +``                               ``Math.Pow(4, len));` `            ``// if i is the length of such number``            ``// then n<4*(4^(i-1)-1)/3 and n>= 4*(4 ^ i-1)/3``            ``// if a valid i is found break the loop``            ``if` `(prev_count < n && curr_count >= n)``                ``break``;` `            ``// check for i + 1``            ``len++;` `            ``prev_count = curr_count;``        ``}` `        ``// Till now we have covered 'prev_count' numbers` `        ``// Finding ith digit at ith place``        ``for` `(``int` `i = 1; i <= len; i++) {``            ` `            ``// j = 1 means 2 j = 2 means ...j = 4 means 7``            ``for` `(``long` `j = 1; j <= 4; j++) {``                ` `                ``// if prev_count + 4 ^ (len-i) is less``                ``// than n, increase prev_count by 4^(x-i)``                ``if` `(prev_count + Math.Pow(4, len - i) < n)``                    ``prev_count += (``long``)Math.Pow(4, len - i);` `                ``// else print the ith digit and break``                ``else` `{``                    ``if` `(j == 1)``                        ``Console.Write(``"2"``);``                    ``else` `if` `(j == 2)``                        ``Console.Write(``"3"``);``                    ``else` `if` `(j == 3)``                        ``Console.Write(``"5"``);``                    ``else` `if` `(j == 4)``                        ``Console.Write(``"7"``);``                    ``break``;``                ``}``            ``}``        ``}``        ``Console.WriteLine();``    ``}` `    ``// Driver method``    ``public` `static` `void` `Main()``    ``{``        ``nthprimedigitsnumber(10);``        ``nthprimedigitsnumber(21);``    ``}``}` `// This code is contributed by Sam007`

## PHP

 `= 4*(4 ^ i-1)/3 if a valid``        ``// i is found break the loop``        ``if` `(``\$prev_count` `< ``\$n` `&&``            ``\$curr_count` `>= ``\$n``)``            ``break``;` `        ``// check for i + 1``        ``\$len``++;` `        ``\$prev_count` `= ``\$curr_count``;``    ``}` `    ``// Till now we have covered``    ``// 'prev_count' numbers` `    ``// Finding ith digit at ith place``    ``for` `(``\$i` `= 1; ``\$i` `<= ``\$len``; ``\$i``++)``    ``{``        ``// j = 1 means 2 j = 2``        ``// means ...j = 4 means 7``        ``for` `(``\$j` `= 1; ``\$j` `<= 4; ``\$j``++)``        ``{``            ``// if prev_count + 4 ^ (len-i)``            ``// is less than n, increase``            ``// prev_count by 4^(x-i)``            ``if` `(``\$prev_count` `+``                 ``pow(4, ``\$len` `- ``\$i``) < ``\$n``)``                ``\$prev_count` `+= pow(4, ``\$len` `- ``\$i``);` `            ``// else print the ith``            ``// digit and break``            ``else``            ``{``                ``if` `(``\$j` `== 1)``                    ``echo` `"2"``;``                ``else` `if` `(``\$j` `== 2)``                    ``echo` `"3"``;``                ``else` `if` `(``\$j` `== 3)``                    ``echo` `"5"``;``                ``else` `if` `(``\$j` `== 4)``                    ``echo` `"7"``;``                ``break``;``            ``}``        ``}``    ``}``    ` `echo` `"\n"``;``}` `// Driver Code``nthprimedigitsnumber(10);``nthprimedigitsnumber(21);` `// This code is contributed by ajit``?>`

## Javascript

 ``

Output

```33
222```

Time Complexity: O(Constant), Length of digits in the worst case will be 18, to count numbers with len – 1 will take 18 operations and to calculate the nth it will take 18 * 4  = 72, so total operation will be 90 which is constant.
Auxiliary Space: O(1)

## Approach 2:

The idea to make the nth number by identifying the below pattern:

/                                 |                        |                            \
2                                3                       5                            7
/ |  | \                         / | |  \                 /  | | \                    /  | |  \
22 23 25 27        32 33 35 37         52 53 55 57        72 73 75 77
/||\/||\/||\/||\       /||\/||\/||\/||\         /||\/||\/||\/||\        /||\/||\/||\/||\
We can notice following :
1st. 5th, 9th. 13th, ….. numbers have 2 as last digit.
2nd. 6th, 10th. 14th, ….. numbers have 3 as last digit.
3nd. 7th, 11th. 15th, ….. numbers have 5 as last digit.
4th. 8th, 12th. 16th, ….. numbers have 7 as last digit.

Follow the steps below to solve the problem:

• First, calculate the remainder when the n is divided by 4 to identify which number is there at that place.
• At last reduce the nth number by dividing it by 4 to calculate the rest of the numbers.
• Repeat above steps till n becomes zero.

Below is the implementation of above approach:

## C++

 `// CPP program to find n-th number with``// prime digits 2, 3,5 and 7``#include ``#include ``#include ``using` `namespace` `std;` `string nthprimedigitsnumber(``int` `number)``{``    ``int` `rem;``    ``string num;``    ``while` `(number) {``        ``// remainder for check element position``        ``rem = number % 4;``        ``switch` `(rem) {` `        ``// if number is 1st position in tree``        ``case` `1:``            ``num.push_back(``'2'``);``            ``break``;` `        ``// if number is 2nd position in tree``        ``case` `2:``            ``num.push_back(``'3'``);``            ``break``;` `        ``// if number is 3rd position in tree``        ``case` `3:``            ``num.push_back(``'5'``);``            ``break``;` `        ``// if number is 4th position in tree``        ``case` `0:``            ``num.push_back(``'7'``);``            ``break``;``        ``}` `        ``if` `(number % 4 == 0)``           ``number--;` `        ``number = number / 4;``    ``}``    ``reverse(num.begin(), num.end());``    ``return` `num;``}` `// Driver code``int` `main()``{``    ``int` `number = 21;``    ``cout << nthprimedigitsnumber(10) << ``"\n"``;``    ``cout << nthprimedigitsnumber(21) << ``"\n"``;``    ``return` `0;``}`

## Java

 `// Java program to find n-th number with``// prime digits 2, 3,5 and 7``import` `java.util.*;``class` `GFG{``static` `String nthprimedigitsnumber(``int` `number)``{``    ``int` `rem;``    ``String num=``""``;``    ``while` `(number>``0``) {``        ``// remainder for check element position``        ``rem = number % ``4``;``        ``switch` `(rem) {` `        ``// if number is 1st position in tree``        ``case` `1``:``            ``num+=``'2'``;``            ``break``;` `        ``// if number is 2nd position in tree``        ``case` `2``:``            ``num+=``'3'``;``            ``break``;` `        ``// if number is 3rd position in tree``        ``case` `3``:``            ``num+=``'5'``;``            ``break``;` `        ``// if number is 4th position in tree``        ``case` `0``:``            ``num+=``'7'``;``            ``break``;``        ``}` `       ``if` `(number % ``4` `== ``0``)``           ``number--;` `        ``number = number / ``4``;``    ``}``    ` `    ``return` `new` `StringBuilder(num).reverse().toString();``}` `// Driver code``public` `static` `void` `main(String[] args)``{``    ``int` `number = ``21``;``    ``System.out.println(nthprimedigitsnumber(``10``));``    ``System.out.println(nthprimedigitsnumber(``21``));``}``}``// This code is contributed by mits`

## Python3

 `# Python3 program to find n-th number``# with prime digits 2, 3 and 7``def` `nthprimedigitsnumber(number):` `    ``num ``=` `"";``    ``while` `(number > ``0``):``        ` `        ``# remainder for check element position``        ``rem ``=` `number ``%` `4``;``        ` `        ``# if number is 1st position in tree``        ``if` `(rem ``=``=` `1``):``            ``num ``+``=` `'2'``;` `        ``# if number is 2nd position in tree``        ``if` `(rem ``=``=` `2``):``            ``num ``+``=` `'3'``;` `        ``# if number is 3rd position in tree``        ``if` `(rem ``=``=` `3``):``            ``num ``+``=` `'5'``;` `        ``# if number is 4th position in tree``        ``if` `(rem ``=``=` `0``):``            ``num ``+``=` `'7'``;` `        ``if` `(number ``%` `4` `=``=` `0``):``            ``number ``=` `number ``-` `1` `        ``number ``=` `number ``/``/` `4``;` `    ``return` `num[::``-``1``];` `# Driver code``number ``=` `21``;``print``(nthprimedigitsnumber(``10``));``print``(nthprimedigitsnumber(number));` `# This code is contributed by mits`

## C#

 `// C# program to find n-th number with``// prime digits 2, 3 and 7``using` `System;``class` `GFG{``static` `string` `nthprimedigitsnumber(``int` `number)``{``    ``int` `rem;``    ``string` `num=``""``;``    ``while` `(number>0) {``        ``// remainder for check element position``        ``rem = number % 4;``        ``switch` `(rem) {` `        ``// if number is 1st position in tree``        ``case` `1:``            ``num+=``'2'``;``            ``break``;` `        ``// if number is 2nd position in tree``        ``case` `2:``            ``num+=``'3'``;``            ``break``;` `        ``// if number is 3rd position in tree``        ``case` `3:``            ``num+=``'5'``;``            ``break``;` `        ``// if number is 4th position in tree``        ``case` `0:``            ``num+=``'7'``;``            ``break``;``        ``}` `       ``if` `(number % 4 == 0)``           ``number--;` `        ``number = number / 4;``    ``}``    ``char``[] st = num.ToCharArray();``    ``Array.Reverse(st);``    ``return` `new` `string``(st);``}` `// Driver code``static` `void` `Main()``{``    ``int` `number = 21;``    ``Console.WriteLine(nthprimedigitsnumber(10));``    ``Console.WriteLine(nthprimedigitsnumber(number));``}``}``// This code is contributed by mits`

## PHP

 ` 0)``    ``{``        ``// remainder for check element position``        ``\$rem` `= ``\$number` `% 4;``        ``switch` `(``\$rem``)``        ``{` `            ``// if number is 1st position in tree``            ``case` `1:``                ``\$num` `.= ``'2'``;``                ``break``;``    ` `            ``// if number is 2nd position in tree``            ``case` `2:``                ``\$num` `.= ``'3'``;``                ``break``;``    ` `            ``// if number is 3rd position in tree``            ``case` `3:``                ``\$num` `.= ``'5'``;``                ``break``;``    ` `            ``// if number is 4th position in tree``            ``case` `0:``                ``\$num` `.= ``'7'``;``                ``break``;``        ``}` `       ``if` `(``\$number` `% 4 == 0)``           ``\$number``--;` `        ``\$number` `= (int)(``\$number` `/ 4);``    ``}` `    ``return` `strrev``(``\$num``);``}` `// Driver code``\$number` `= 21;``print``(nthprimedigitsnumber(10) . ``"\n"``);``print``(nthprimedigitsnumber(``\$number``));` `// This code is contributed by mits`

## Javascript

 ``

Output

```33
222```

Time Complexity: O(N/4), Looping till the Nth number becomes zero which is reducing by 4 every time.
Auxiliary Space: O(1)

This article is contributed by Ayush Jha and Devanshu agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

My Personal Notes arrow_drop_up