📌  相关文章
📜  N位数字,第一位和最后一位之间的差异为K

📅  最后修改于: 2021-04-24 19:18:04             🧑  作者: Mango

给定两个整数NK ,任务是打印所有由N位数字组成的正数,这些数字的第一位和最后一位之间的差等于K。

例子:

方法:想法是使用递归将所有可能的1位数字生成为N位数字,并检查该数字的第一位和最后一位之间的差是否等于K。步骤如下:

  1. 生成所有可能的长度为1的数字。
  2. 在每个步骤中,请继续在数字上添加数字,直到数字的长度变为N为止。
  3. 当数字的长度等于N时,计算数字的第一位和最后一位之间的差,并检查差是否等于N。如果发现是真实的,则打印该数字并继续生成下一个数字。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Function to store and check the
// difference of digits
void findNumbers(string st, vector& 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 numDifference(int N, int K)
{
    vector 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 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


输出:
90

时间复杂度: O(2 N )
辅助空间: O(N)