Given an integer N, the task is to find the Nth pure number.
A pure number has to satisfy three conditions:
1) It has an even number of digits.
2) All digits are either 4 or 5.
3) And the number is a palindrome.
The Pure number series is: 44, 55, 4444, 4554, 5445, 5555, 444444, 445544, 454454, 455554 and so on.
Examples:
Input: 5
Output: 5445
Explanation:
5445 is the 5th pure number in the series.
Input: 19
Output: 45444454
Explanation:
45444454 is the 19th pure number in the series.
Approach: We will assume that 2 numbers make one single block. For each block, there is a 2block number of pure numbers. For pure numbers with 1 block, there are 21 pure numbers; for numbers with 2 blocks, there are 22 numbers, and so on.
- Pure numbers starting with 4, start at position 2block – 1 for example, 4444 is at (22 -1 = 3) which means it is, at third position in the series.
- Pure numbers starting with 5 starts at position 2block + 2(block-1) -1 for example, 5555 is at (2^2 + 2^1 -1 =5) which means it is at the fifth position in the series.
A pure number in a block is essentially sandwiched between two 4’s or 5’s and is a combination of all previous block numbers. To understand it better, let’s consider the example below:
- The first pure number is 44 and the second pure number is 55.
- 4444 (“4″+ “44” + “4”) 44 from previous block
- 4554 (“4″+ “55” + “4”) 55 from previous block
- 5445 (“5″+ “44” + “5”) 44 from previous block
- 5555 (“5″+ “55” + “5”) 55 from previous block
This pattern repeats for all the numbers in the series.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
bool isPowerOfTwo( int N)
{
double number = log (N)/ log (2);
int checker = int (number);
return number - checker == 0;
}
bool isSeriesFour( int N, int digits)
{
int upperBound = int ( pow (2, digits)+ pow (2, digits - 1)-1);
int lowerBound = int ( pow (2, digits)-1);
return (N >= lowerBound) && (N < upperBound);
}
string getPureNumber( int N)
{
string numbers[N + 1];
numbers[0] = "" ;
int blocks = 0;
int displacement = 0;
for ( int i = 1; i < N + 1; i++) {
if (isPowerOfTwo(i + 1)) {
blocks = blocks + 1;
}
if (isSeriesFour(i, blocks)) {
displacement
= int ( pow (2, blocks - 1));
numbers[i] = "4" + numbers[i - displacement] + "4" ;
}
else {
displacement = int ( pow (2, blocks));
numbers[i] = "5" + numbers[i - displacement] + "5" ;
}
}
return numbers[N];
}
int main()
{
int N = 5;
string pure = getPureNumber(N);
cout << pure << endl;
}
|
Java
import java.io.*;
class PureNumbers {
public boolean isPowerOfTwo( int N)
{
double number
= Math.log(N) / Math.log( 2 );
int checker = ( int )number;
return number - checker == 0 ;
}
public boolean isSeriesFour(
int N, int digits)
{
int upperBound
= ( int )(Math.pow( 2 , digits)
+ Math.pow( 2 , digits - 1 )
- 1 );
int lowerBound
= ( int )(Math.pow( 2 , digits)
- 1 );
return (N >= lowerBound)
&& (N < upperBound);
}
public String getPureNumber( int N)
{
String[] numbers
= new String[N + 1 ];
numbers[ 0 ] = "" ;
int blocks = 0 ;
int displacement = 0 ;
for ( int i = 1 ; i < N + 1 ; i++) {
if (isPowerOfTwo(i + 1 )) {
blocks = blocks + 1 ;
}
if (isSeriesFour(i, blocks)) {
displacement
= ( int )Math.pow(
2 , blocks - 1 );
numbers[i]
= "4"
+ numbers[i - displacement]
+ "4" ;
}
else {
displacement
= ( int )Math.pow(
2 , blocks);
numbers[i]
= "5"
+ numbers[i - displacement]
+ "5" ;
}
}
return numbers[N];
}
public static void main(String[] args)
throws Exception
{
int N = 5 ;
PureNumbers ob = new PureNumbers();
String pure = ob.getPureNumber(N);
System.out.println(pure);
}
}
|
Python3
import math
def isPowerOfTwo(N):
number = math.log(N) / math.log( 2 )
checker = math.floor(number)
return number - checker = = 0
def isSeriesFour(N, digits):
upperBound = math.floor(math. pow ( 2 , digits) + math. pow ( 2 , digits - 1 ) - 1 )
lowerBound = math.floor(math. pow ( 2 , digits) - 1 )
return (N > = lowerBound) and (N < upperBound)
def getPureNumber(N):
numbers = ["" for i in range (N + 1 )]
numbers[ 0 ] = ""
blocks = 0
displacement = 0
for i in range ( 1 ,N + 1 ):
if (isPowerOfTwo(i + 1 )):
blocks = blocks + 1
if (isSeriesFour(i, blocks)):
displacement = math.floor(math. pow ( 2 , blocks - 1 ))
numbers[i] = f "4{numbers[i - displacement]}4"
else :
displacement = math.floor(math. pow ( 2 , blocks))
numbers[i] = f "5{numbers[i - displacement]}5"
return numbers[N]
N = 5
pure = getPureNumber(N)
print (pure)
|
C#
using System;
class PureNumbers {
public bool isPowerOfTwo( int N)
{
double number
= Math.Log(N) / Math.Log(2);
int checker = ( int )number;
return number - checker == 0;
}
public bool isSeriesFour(
int N, int digits)
{
int upperBound
= ( int )(Math.Pow(2, digits)
+ Math.Pow(2, digits - 1)
- 1);
int lowerBound
= ( int )(Math.Pow(2, digits)
- 1);
return (N >= lowerBound)
&& (N < upperBound);
}
public string getPureNumber( int N)
{
string [] numbers
= new string [N + 1];
numbers[0] = "" ;
int blocks = 0;
int displacement = 0;
for ( int i = 1; i < N + 1; i++) {
if (isPowerOfTwo(i + 1)) {
blocks = blocks + 1;
}
if (isSeriesFour(i, blocks)) {
displacement
= ( int )Math.Pow(
2, blocks - 1);
numbers[i]
= "4"
+ numbers[i - displacement]
+ "4" ;
}
else {
displacement
= ( int )Math.Pow(
2, blocks);
numbers[i]
= "5"
+ numbers[i - displacement]
+ "5" ;
}
}
return numbers[N];
}
public static void Main()
{
int N = 5;
PureNumbers ob = new PureNumbers();
string pure = ob.getPureNumber(N);
Console.Write(pure);
}
}
|
Javascript
<script>
function isPowerOfTwo(N)
{
let number = Math.log(N)/Math.log(2);
let checker = Math.floor(number);
return number - checker == 0;
}
function isSeriesFour(N, digits)
{
let upperBound = Math.floor(Math.pow(2, digits) + Math.pow(2, digits - 1)-1);
let lowerBound = Math.floor(Math.pow(2, digits)-1);
return (N >= lowerBound) && (N < upperBound);
}
function getPureNumber(N)
{
let numbers = new Array(N + 1);
numbers[0] = "" ;
let blocks = 0;
let displacement = 0;
for (let i = 1; i < N + 1; i++) {
if (isPowerOfTwo(i + 1)) {
blocks = blocks + 1;
}
if (isSeriesFour(i, blocks)) {
displacement
= Math.floor(Math.pow(2, blocks - 1));
numbers[i] = "4" + numbers[i - displacement] + "4" ;
}
else {
displacement = Math.floor(Math.pow(2, blocks));
numbers[i] = "5" + numbers[i - displacement] + "5" ;
}
}
return numbers[N];
}
let N = 5;
let pure = getPureNumber(N);
document.write(pure + "<br>" );
</script>
|
Time Complexity: O(NlogN) as using pow function in a loop
Auxiliary Space: O(N)
Last Updated :
16 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...