Dados dos enteros N y K , la tarea es generar todos los enteros positivos con longitud N que tengan una diferencia absoluta de dígitos adyacentes igual a K .
Ejemplos:
Entrada: N = 4, K = 8
Salida: 1919, 8080, 9191
Explicación:
La diferencia absoluta entre cada dígito consecutivo de cada número es 8.
Por ejemplo: 8080 (abs(8-0) = 8, abs(0-8 ) = 8)Entrada: N = 2, K = 2
Salida: 13, 24, 20, 35, 31, 46, 42, 57, 53, 68, 64, 79, 75, 86, 97
Explicación:
La diferencia absoluta entre cada dígito consecutivo de cada número es 1.
Enfoque: La idea es utilizar Backtracking . Iterar sobre los dígitos [1, 9] y para cada dígito del número de N dígitos que tenga una diferencia de dígito absoluto como K usando recursividad . A continuación se muestran los pasos:
1. Cree un vector ans[] para almacenar todos los números resultantes e itere recursivamente del 1 al 9 para generar números a partir de cada dígito. A continuación se muestran los casos:
- Caso base: para todos los enteros de una sola longitud, es decir, N = 1 , agréguelos a ans[] .
- Llamada recursiva: si agregar el dígito K a los números al dígito de uno no excede 9 , llame recursivamente disminuyendo la N y actualice num a (10*num + num%10 + K) como se muestra a continuación:
if(num % 10 + K ≤ 9) {
función_recursiva(10 * num + (num % 10 + K), K, N – 1, y);
}
- Si el valor de K es distinto de cero después de todas las llamadas recursivas y si num % 10 >= K , entonces vuelva a llamar recursivamente disminuyendo N y actualice num a (10*num + num%10 – K) como:
recursive_function(10 * num + num % 10 – K, K, N – 1, ans);
2. Después de todos los pasos anteriores, imprima los números almacenados en ans[] .
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function that recursively finds the // possible numbers and append into ans void checkUntil(int num, int K, int N, vector<int>& ans) { // Base Case if (N == 1) { ans.push_back(num); return; } // Check the sum of last digit and k // less than or equal to 9 or not if ((num % 10 + K) <= 9) checkUntil(10 * num + (num % 10 + K), K, N - 1, ans); // If k==0, then subtraction and // addition does not make any // difference // Hence, subtraction is skipped if (K) { if ((num % 10 - K) >= 0) checkUntil(10 * num + num % 10 - K, K, N - 1, ans); } } // Function to call checkUntil function // for every integer from 1 to 9 void check(int K, int N, vector<int>& ans) { // check_util function recursively // store all numbers starting from i for (int i = 1; i <= 9; i++) { checkUntil(i, K, N, ans); } } // Function to print the all numbers // which satisfy the conditions void print(vector<int>& ans) { for (int i = 0; i < ans.size(); i++) { cout << ans[i] << ", "; } } // Driver Code int main() { // Given N and K int N = 4, K = 8; // To store the result vector<int> ans; // Function Call check(K, N, ans); // Print Resultant Numbers print(ans); return 0; }
Java
// Java program for // the above approach import java.util.*; class GFG{ // Function that recursively finds the // possible numbers and append into ans static void checkUntil(int num, int K, int N, Vector<Integer> ans) { // Base Case if (N == 1) { ans.add(num); return; } // Check the sum of last digit and k // less than or equal to 9 or not if ((num % 10 + K) <= 9) checkUntil(10 * num + (num % 10 + K), K, N - 1, ans); // If k==0, then subtraction and // addition does not make any // difference // Hence, subtraction is skipped if (K > 0) { if ((num % 10 - K) >= 0) checkUntil(10 * num + num % 10 - K, K, N - 1, ans); } } // Function to call checkUntil function // for every integer from 1 to 9 static void check(int K, int N, Vector<Integer> ans) { // check_util function recursively // store all numbers starting from i for (int i = 1; i <= 9; i++) { checkUntil(i, K, N, ans); } } // Function to print the all numbers // which satisfy the conditions static void print(Vector<Integer> ans) { for (int i = 0; i < ans.size(); i++) { System.out.print(ans.get(i) + ", "); } } // Driver Code public static void main(String[] args) { // Given N and K int N = 4, K = 8; // To store the result Vector<Integer> ans = new Vector<Integer>();; // Function Call check(K, N, ans); // Print Resultant Numbers print(ans); } } // This code is contributed by Amit Katiyar
Python3
# Python3 program for the above approach # Function that recursively finds the # possible numbers and append into ans def checkUntil(num, K, N, ans): # Base Case if (N == 1): ans.append(num) return # Check the sum of last digit and k # less than or equal to 9 or not if ((num % 10 + K) <= 9): checkUntil(10 * num + (num % 10 + K), K, N - 1, ans) # If k==0, then subtraction and # addition does not make any # difference # Hence, subtraction is skipped if (K): if ((num % 10 - K) >= 0): checkUntil(10 * num + num % 10 - K, K, N - 1, ans) # Function to call checkUntil function # for every integer from 1 to 9 def check(K, N, ans): # check_util function recursively # store all numbers starting from i for i in range(1, 10): checkUntil(i, K, N, ans) # Function to print the all numbers # which satisfy the conditions def print_list(ans): for i in range(len(ans)): print(ans[i], end = ", ") # Driver Code if __name__ == "__main__": # Given N and K N = 4 K = 8; # To store the result ans = [] # Function call check(K, N, ans) # Print resultant numbers print_list(ans) # This code is contributed by chitranayal
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{ // Function that recursively finds the // possible numbers and append into ans static void checkUntil(int num, int K, int N, List<int> ans) { // Base Case if (N == 1) { ans.Add(num); return; } // Check the sum of last digit and k // less than or equal to 9 or not if ((num % 10 + K) <= 9) checkUntil(10 * num + (num % 10 + K), K, N - 1, ans); // If k==0, then subtraction and // addition does not make any // difference // Hence, subtraction is skipped if (K > 0) { if ((num % 10 - K) >= 0) checkUntil(10 * num + num % 10 - K, K, N - 1, ans); } } // Function to call checkUntil function // for every integer from 1 to 9 static void check(int K, int N, List<int> ans) { // check_util function recursively // store all numbers starting from i for(int i = 1; i <= 9; i++) { checkUntil(i, K, N, ans); } } // Function to print the all numbers // which satisfy the conditions static void print(List<int> ans) { for(int i = 0; i < ans.Count; i++) { Console.Write(ans[i] + ", "); } } // Driver Code public static void Main(String[] args) { // Given N and K int N = 4, K = 8; // To store the result List<int> ans = new List<int>();; // Function call check(K, N, ans); // Print Resultant Numbers print(ans); } } // This code is contributed by Amit Katiyar
Javascript
<script> // Javascript program to implement // the above approach // Function that recursively finds the // possible numbers and append into ans function checkUntil(num, K, N, ans) { // Base Case if (N == 1) { ans.push(num); return; } // Check the sum of last digit and k // less than or equal to 9 or not if ((num % 10 + K) <= 9) checkUntil(10 * num + (num % 10 + K), K, N - 1, ans); // If k==0, then subtraction and // addition does not make any // difference // Hence, subtraction is skipped if (K > 0) { if ((num % 10 - K) >= 0) checkUntil(10 * num + num % 10 - K, K, N - 1, ans); } } // Function to call checkUntil function // for every integer from 1 to 9 function check(K, N, ans) { // check_util function recursively // store all numbers starting from i for (let i = 1; i <= 9; i++) { checkUntil(i, K, N, ans); } } // Function to print the all numbers // which satisfy the conditions function print( ans) { for (let i = 0; i < ans.length; i++) { document.write(ans[i] + ", "); } } // Driver Code // Given N and K let N = 4, K = 8; // To store the result let ans = [] // Function Call check(K, N, ans); // Print Resultant Numbers print(ans); </script>
1919, 8080, 9191,
Complejidad temporal: O(2 N )
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por deepanshujindal634 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA