Consider a series of numbers composed of only digits 4 and 7. First few numbers in the series are 4, 7, 44, 47, 74, 77, 444, .. etc. Given a number n, we need to find n-th number in the series.
Examples:
Input : n = 2 Output : 7 Input : n = 3 Output : 44 Input : n = 5 Output : 74 Input : n = 6 Output : 77
We have discussed a O(n) solution in below post.
Find n-th element in a series with only 2 digits (4 and 7) allowed
In this post, a O(log n) solution is discussed which is based on below pattern in numbers. The numbers can be seen
""
/ \
4 7
/ \ / \
44 47 74 77
/ \ / \ / \ / \
The idea is to fill the required number from end. We know can observe that the last digit is 4 if n is odd and last digit is 7 if n is even. After filling last digit, we move to parent node in tree. If n is odd, then parent node corresponds to (n-1/2. Else parent node corresponds to (n-2)/2.
// C++ program to find n-th number containing
// only 4 and 7.
#include<bits/stdc++.h>
using namespace std;
string findNthNo(int n)
{
string res = "";
while (n >= 1)
{
// If n is odd, append 4 and
// move to parent
if (n & 1)
{
res = res + "4";
n = (n-1)/2;
}
// If n is even, append 7 and
// move to parent
else
{
res = res + "7";
n = (n-2)/2;
}
}
// Reverse res and return.
reverse(res.begin(), res.end());
return res;
}
// Driver code
int main()
{
int n = 13;
cout << findNthNo(n);
return 0;
}
// java program to find n-th number
// containing only 4 and 7.
public class GFG {
static String findNthNo(int n)
{
String res = "";
while (n >= 1)
{
// If n is odd, append
// 4 and move to parent
if ((n & 1) == 1)
{
res = res + "4";
n = (n - 1) / 2;
}
// If n is even, append
// 7 and move to parent
else
{
res = res + "7";
n = (n - 2) / 2;
}
}
// Reverse res and return.
StringBuilder sb =
new StringBuilder(res);
sb.reverse();
return new String(sb);
}
// Driver code
public static void main(String args[])
{
int n = 13;
System.out.print( findNthNo(n) );
}
}
// This code is contributed by Sam007
# Python3 program to find
# n-th number containing
# only 4 and 7.
def reverse(s):
if len(s) == 0:
return s
else:
return reverse(s[1:]) + s[0]
def findNthNo(n):
res = "";
while (n >= 1):
# If n is odd, append
# 4 and move to parent
if (n & 1):
res = res + "4";
n = (int)((n - 1) / 2);
# If n is even, append7
# and move to parent
else:
res = res + "7";
n = (int)((n - 2) / 2);
# Reverse res
# and return.
return reverse(res);
# Driver code
n = 13;
print(findNthNo(n));
# This code is contributed
# by mits
// C# program to find n-th number
// containing only 4 and 7.
using System;
class GFG {
static string findNthNo(int n)
{
string res = "";
while (n >= 1)
{
// If n is odd, append 4 and
// move to parent
if ((n & 1) == 1)
{
res = res + "4";
n = (n - 1) / 2;
}
// If n is even, append 7 and
// move to parent
else
{
res = res + "7";
n = (n - 2) / 2;
}
}
// Reverse res and return.
char[] arr = res.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
// Driver Code
public static void Main()
{
int n = 13;
Console.Write( findNthNo(n) );
}
}
// This code is contributed by Sam007
<?php
// PHP program to find
// n-th number containing
// only 4 and 7.
function findNthNo($n)
{
$res = "";
while ($n >= 1)
{
// If n is odd, append
// 4 and move to parent
if ($n & 1)
{
$res = $res . "4";
$n = (int)(($n - 1) / 2);
}
// If n is even, append
// 7 and move to parent
else
{
$res = $res . "7";
$n = (int)(($n - 2) / 2);
}
}
// Reverse res
// and return.
return strrev($res);
}
// Driver code
$n = 13;
echo findNthNo($n);
// This code is contributed
// by mits
?>
<script>
// javascript program to find n-th number
// containing only 4 and 7.
function findNthNo(n)
{
res = "";
while (n >= 1)
{
// If n is odd, append
// 4 and move to parent
if ((n & 1) == 1)
{
res = res + "4";
n = (n - 1) / 2;
}
// If n is even, append
// 7 and move to parent
else
{
res = res + "7";
n = parseInt((n - 2) / 2);
}
}
// Reverse res and return.
return res.split("").reverse().join("");
}
// Driver code
var n = 13;
document.write( findNthNo(n) );
// This code is contributed by 29AjayKumar
</script>
Output:
774
Time Complexity: O(logN), where N represents the given integer.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
In this code the total complexity is O(log n). Because while loop run log (n) times.