Given two integer N and K, the task is to print all positive numbers made up of N digits whose difference between the first and last digits equal to K.
Examples:
Input: N = 2, K = 0
Output: 11, 22, 33, 44, 55, 66, 77, 88, 99Input: N = 2, K = 9
Output: 90
Approach: The idea is to generate all possible 1-digit numbers to N-digit numbers using recursion and check if the difference between the first and the last digit of that number is equal to K or not. Below are the steps:
- Generate all possible numbers with length 1.
- At each step, keep on adding digits to the number until the length of the number becomes N.
- When the length of the number becomes equal to N, calculate the difference between the first and last digit of the number, and check if the difference is equal to N or not. If found to be true, print that number and proceed to generate the next number.
Below is the implementation of the above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to store and check the // difference of digits void findNumbers(string st, vector< int >& result,
int prev, int n, int K)
{ // Base Case
if (st.length() == n) {
result.push_back(stoi(st));
return ;
}
// Last digit of the number to
// check the difference from the
// first digit
if (st.size() == n - 1) {
// Condition to avoid
// repeated values
if (prev - K >= 0) {
string pt = "" ;
// Update the string pt
pt += prev - K + 48;
// Recursive Call
findNumbers(st + pt, result,
prev - K, n, K);
}
if (K != 0 && prev + K < 10) {
string pt = "" ;
// Update the string pt
pt += prev + K + 48;
// Recursive Call
findNumbers(st + pt, result,
prev + K, n, K);
}
}
// Any number can come in between
// first and last except the zero
else {
for ( int j = 1; j <= 9; j++) {
string pt = "" ;
pt += j + 48;
// Recursive Call
findNumbers(st + pt, result,
prev, n, K);
}
}
} // Function to place digit of the number vector< int > numDifference( int N, int K)
{ vector< int > res;
string st = "" ;
// When N is 1 and K > 0, then the
// single number will be the first
// and last digit it cannot have
// difference greater than 0
if (N == 1 && K == 0) {
res.push_back(0);
}
else if (N == 1 && K > 0) {
return res;
}
// This loop place the digit at the
// starting
for ( int i = 1; i < 10; i++) {
string temp = "" ;
temp += 48 + i;
// Recursive Call
findNumbers(st + temp, res, i, N, K);
st = "" ;
}
return res;
} void numDifferenceUtil( int N, int K)
{ // Vector to store results
vector< int > res;
// Generate all the resultant number
res = numDifference(N, K);
// Print the result
for ( int i = 0; i < res.size(); i++) {
cout << res[i] << " " ;
}
} // Driver Code int main()
{ int N = 2, K = 9;
// Function Call
numDifferenceUtil(N, K);
return 0;
} |
Java
// Java program for the above approach import java.util.*;
@SuppressWarnings ( "unchecked" )
class GFG{
// Function to store and check the // difference of digits static void findNumbers(String st, ArrayList result,
int prev, int n, int K)
{ // Base Case
if (st.length() == n)
{
result.add(Integer.parseInt(st));
return ;
}
// Last digit of the number to
// check the difference from the
// first digit
if (st.length() == n - 1 )
{
// Condition to avoid
// repeated values
if (prev - K >= 0 )
{
String pt = "" ;
// Update the String pt
pt += ( char )(prev - K + 48 );
// Recursive Call
findNumbers(st + pt, result,
prev - K, n, K);
}
if (K != 0 && prev + K < 10 )
{
String pt = "" ;
// Update the String pt
pt += ( char )(prev + K + 48 );
// Recursive Call
findNumbers(st + pt, result,
prev + K, n, K);
}
}
// Any number can come in between
// first and last except the zero
else
{
for ( int j = 1 ; j <= 9 ; j++)
{
String pt = "" ;
pt += ( char )(j + 48 );
// Recursive Call
findNumbers(st + pt, result,
prev, n, K);
}
}
} // Function to place digit of the number static ArrayList numDifference( int N, int K)
{ ArrayList res = new ArrayList();
String st = "" ;
// When N is 1 and K > 0, then the
// single number will be the first
// and last digit it cannot have
// difference greater than 0
if (N == 1 && K == 0 )
{
res.add( 0 );
}
else if (N == 1 && K > 0 )
{
return res;
}
// This loop place the digit at the
// starting
for ( int i = 1 ; i < 10 ; i++)
{
String temp = "" ;
temp += ( char )( 48 + i);
// Recursive Call
findNumbers(st + temp, res, i, N, K);
st = "" ;
}
return res;
} static void numDifferenceUtil( int N, int K)
{ // Vector to store results
ArrayList res = new ArrayList();
// Generate all the resultant number
res = numDifference(N, K);
// Print the result
for ( int i = 0 ; i < res.size(); i++)
{
System.out.print(res.get(i) + " " );
}
} // Driver Code public static void main(String []args)
{ int N = 2 , K = 9 ;
// Function Call
numDifferenceUtil(N, K);
} } // This code is contributed by pratham76 |
Python3
# Python3 program for # the above approach # Function to store and # check the difference # of digits result = []
def findNumbers(st, prev,
n, K):
global result
# Base Case
if ( len (st) = = n):
result.append( int (st))
return
# Last digit of the number to
# check the difference from the
# first digit
if ( len (st) = = n - 1 ):
# Condition to avoid
# repeated values
if (prev - K > = 0 ):
pt = ""
# Update the string pt
pt + = prev - K + 48
# Recursive Call
findNumbers(st + pt,
prev - K,
n, K)
if (K ! = 0 and
prev + K < 10 ):
pt = ""
# Update the string pt
pt + = prev + K + 48
# Recursive Call
findNumbers(st + pt,
prev + K,
n, K)
# Any number can come in between
# first and last except the zero
else :
for j in range ( 1 , 10 , 1 ):
pt = ""
pt + = j + 48
# Recursive Call
findNumbers(st + pt,
prev, n, K)
# Function to place digit # of the number def numDifference(N,K):
global result
st = ""
# When N is 1 and K > 0,
# then the single number
# will be the first and
# last digit it cannot have
# difference greater than 0
if (N = = 1 and K = = 0 ):
result.append( 0 )
elif (N = = 1 and K > 0 ):
return result
# This loop place the
# digit at the starting
for i in range ( 1 , 10 , 1 ):
temp = ""
temp + = str ( 48 + i)
# Recursive Call
findNumbers(st + temp,
i, N, K)
st = ""
return result
def numDifferenceUtil(N, K):
# Vector to store results
res = []
# Generate all the
# resultant number
res = numDifference(N, K)
# Print the result
for i in range ( 1 , len (res)):
print (res[i] + 40 ,
end = " " )
break
# Driver Code if __name__ = = '__main__' :
N = 2
K = 9
# Function Call
numDifferenceUtil(N, K)
# This code is contributed by bgangwar59 |
C#
// C# program for the above approach using System;
using System.Collections;
using System.Collections.Generic;
class GFG
{ // Function to store and check the // difference of digits static void findNumbers( string st, ArrayList result,
int prev, int n, int K)
{ // Base Case
if (st.Length == n) {
result.Add(Int32.Parse(st));
return ;
}
// Last digit of the number to
// check the difference from the
// first digit
if (st.Length == n - 1) {
// Condition to avoid
// repeated values
if (prev - K >= 0) {
string pt = "" ;
// Update the string pt
pt += ( char )(prev - K + 48);
// Recursive Call
findNumbers(st + pt, result,
prev - K, n, K);
}
if (K != 0 && prev + K < 10) {
string pt = "" ;
// Update the string pt
pt += ( char )(prev + K + 48);
// Recursive Call
findNumbers(st + pt, result,
prev + K, n, K);
}
}
// Any number can come in between
// first and last except the zero
else {
for ( int j = 1; j <= 9; j++) {
string pt = "" ;
pt += ( char )(j + 48);
// Recursive Call
findNumbers(st + pt, result,
prev, n, K);
}
}
} // Function to place digit of the number static ArrayList numDifference( int N, int K)
{ ArrayList res= new ArrayList();
string st = "" ;
// When N is 1 and K > 0, then the
// single number will be the first
// and last digit it cannot have
// difference greater than 0
if (N == 1 && K == 0) {
res.Add(0);
}
else if (N == 1 && K > 0) {
return res;
}
// This loop place the digit at the
// starting
for ( int i = 1; i < 10; i++) {
string temp = "" ;
temp += ( char )(48 + i);
// Recursive Call
findNumbers(st + temp, res, i, N, K);
st = "" ;
}
return res;
} static void numDifferenceUtil( int N, int K)
{ // Vector to store results
ArrayList res= new ArrayList();
// Generate all the resultant number
res = numDifference(N, K);
// Print the result
for ( int i = 0; i < res.Count; i++) {
Console.Write(res[i]+ " " );
}
} // Driver Code public static void Main( string []args)
{ int N = 2, K = 9;
// Function Call
numDifferenceUtil(N, K);
} } // This code is contributed by rutvik_56 |
Javascript
<script> // Javascript program for the above approach
// Function to store and check the
// difference of digits
function findNumbers(st, result, prev, n, K)
{
// Base Case
if (st.length == n) {
result.push(parseInt(st));
return ;
}
// Last digit of the number to
// check the difference from the
// first digit
if (st.length == n - 1) {
// Condition to avoid
// repeated values
if (prev - K >= 0) {
let pt = "" ;
// Update the string pt
pt += String.fromCharCode(prev - K + 48);
// Recursive Call
findNumbers(st + pt, result,
prev - K, n, K);
}
if (K != 0 && prev + K < 10) {
let pt = "" ;
// Update the string pt
pt += String.fromCharCode(prev + K + 48);
// Recursive Call
findNumbers(st + pt, result,
prev + K, n, K);
}
}
// Any number can come in between
// first and last except the zero
else {
for (let j = 1; j <= 9; j++) {
let pt = "" ;
pt += String.fromCharCode(j + 48);
// Recursive Call
findNumbers(st + pt, result,
prev, n, K);
}
}
}
// Function to place digit of the number
function numDifference(N, K)
{
let res = [];
let st = "" ;
// When N is 1 and K > 0, then the
// single number will be the first
// and last digit it cannot have
// difference greater than 0
if (N == 1 && K == 0) {
res.push(0);
}
else if (N == 1 && K > 0) {
return res;
}
// This loop place the digit at the
// starting
for (let i = 1; i < 10; i++) {
let temp = "" ;
temp += String.fromCharCode(48 + i);
// Recursive Call
findNumbers(st + temp, res, i, N, K);
st = "" ;
}
return res;
}
function numDifferenceUtil(N, K)
{
// Vector to store results
let res = [];
// Generate all the resultant number
res = numDifference(N, K);
// Print the result
for (let i = 0; i < res.length; i++) {
document.write(res[i]+ " " );
}
}
let N = 2, K = 9;
// Function Call
numDifferenceUtil(N, K);
// This code is contributed by divyeshrabadiya07. </script> |
Output:
90
Time Complexity: O(2N)
Auxiliary Space: O(N)