Encuentre dos números con suma N tal que ninguno de ellos contenga el dígito K

Dado un número N y un dígito K (1 < K <= 9), la tarea es encontrar dos números enteros A y B tales que A + B = N y el dígito K no esté presente ni en A ni en B.

Ejemplos: 

Entrada: N = 443, K = 4 
Salida: 256, 187 
Explicación: 
Suma = 256 + 187 = 443 = N 
Además, K(4) no está presente en 256 o 187 
Por lo tanto, 256 y 187 son salidas válidas.

Entrada: N = 678, K = 9 
Salida: 311, 367 
Explicación: 
Suma = 311 + 367 = 678 = N 
Además, K(9) no está presente en 311 o 367 
Por lo tanto, 311 y 367 son salidas válidas. 

Enfoque ingenuo: 
un enfoque simple es ejecutar un ciclo y considerar cada elemento (digamos A) de 1 a N-1. Como la suma de A y B tiene que ser N, el B correspondiente será (N – A). Ahora verifique si tanto A como B contienen K o no, si no, imprima A y B. Este enfoque fallará para entradas más grandes como N = 10 18

Complejidad temporal: O(N)  
Espacio auxiliar: O(1)

Enfoque eficiente: 
el problema dado se puede resolver de manera mucho más eficiente. La idea es dividir cada dígito D de N en dos partes D1 y D2 de modo que D1 + D2 = D. Tome dos strings A y B , A contendrá todos los D1 y la string B contendrá todos los D2. 
Por ejemplo, N = 4467 y K = 4 

D    D1    D2
4    2    2
4    2    2
6    6    0
7    7    0    

Aquí, A será 2267 y B será 2200.
Los pasos detallados de este enfoque son los siguientes: 
1. Atraviese N y considere cada uno de  sus dígitos D.
2. Si el dígito D es igual a K, divídalo en D1 = D / 2 y D2 = D / 2 + D % 2. 
D % 2 se suma a D2 para asegurar que D1 + D2 = D tanto para D par como impar 3.  De lo contrario,
divídalo en D1 = D y D2 = 0. 
4. Siga agregando D1 a la string A y D2 a la string B. 
5. Finalmente, imprima las strings A y B, después de eliminar los ceros iniciales (si los hay).

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ implementation of
// the above approach
 
#include <iostream>
using namespace std;
 
string removeLeadingZeros(string str)
{
    // Count leading zeros
    int i = 0;
    int n = str.length();
    while (str[i] == '0' && i < n)
        i++;
 
    // It removes i characters
    // starting from index 0
    str.erase(0, i);
 
    return str;
}
 
void findPairs(int sum, int K)
{
 
    string A, B;
    A = "";
    B = "";
 
    string N = to_string(sum);
    int n = N.length();
 
    // Check each digit of the N
    for (int i = 0; i < n; i++) {
 
        int D = N[i] - '0';
 
        // If digit is K break it
        if (D == K) {
            int D1, D2;
            D1 = D / 2;
 
            // For odd numbers
            D2 = D / 2 + D % 2;
 
            // Add D1 to A and D2 to B
            A = A + char(D1 + '0');
            B = B + char(D2 + '0');
        }
 
        // If the digit is not K,
        // no need to break
        // string D in A and 0 in B
        else {
            A = A + char(D + '0');
            B = B + '0';
        }
    }
 
    // Remove leading zeros
    A = removeLeadingZeros(A);
    B = removeLeadingZeros(B);
 
    // Print the answer
    cout << A << ", " << B << endl;
}
 
// Driver code
int main()
 
{
    int N = 33673;
    int K = 3;
 
    findPairs(N, K);
 
    return 0;
}

Java

// Java implementation of the above approach
class GFG{
 
static String removeLeadingZeros(String str)
{
     
    // Count leading zeros
    int i = 0;
    int n = str.length();
     
    while (str.charAt(i) == '0' && i < n)
        i++;
 
    // It removes i characters
    // starting from index 0
    str = str.substring(i);
 
    return str;
}
 
static void findPairs(int sum, int K)
{
 
    String A, B;
    A = "";
    B = "";
 
    String N = String.valueOf(sum);
    int n = N.length();
 
    // Check each digit of the N
    for(int i = 0; i < n; i++)
    {
       int D = N.charAt(i) - '0';
        
       // If digit is K break it
       if (D == K)
       {
           int D1, D2;
           D1 = D / 2;
            
           // For odd numbers
           D2 = D / 2 + D % 2;
            
           // Add D1 to A and D2 to B
           A = A + (char)(D1 + '0');
           B = B + (char)(D2 + '0');
       }
        
       // If the digit is not K,
       // no need to break
       // String D in A and 0 in B
       else
       {
           A = A + (char)(D + '0');
           B = B + '0';
       }
    }
     
    // Remove leading zeros
    A = removeLeadingZeros(A);
    B = removeLeadingZeros(B);
 
    // Print the answer
    System.out.print(A + ", " + B + "\n");
}
 
// Driver code
public static void main(String[] args)
{
    int N = 33673;
    int K = 3;
 
    findPairs(N, K);
}
}
 
// This code is contributed by sapnasingh4991

Python3

# Python3 implementation of the
# above approach
def removeLeadingZeros(Str):
     
    # Count leading zeros
    i = 0
    n = len(Str)
       
    while (Str[i] == '0' and i < n):
        i += 1
   
    # It removes i characters
    # starting from index 0
    Str = Str[i:]
    return Str
   
def findPairs(Sum, K):
  
    A = ""
    B = ""
   
    N = str(Sum)
    n = len(N)
 
    # Check each digit of the N
    for i in range(n):
     
       D = int(N[i]) - int('0')
          
       # If digit is K break it
       if (D == K):
           D1 = D // 2;
              
           # For odd numbers
           D2 = (D // 2) + (D % 2)
 
           # Add D1 to A and D2 to B
           A = A + (str)(D1 + int('0'))
           B = B + (str)(D2 + int('0'))
            
       # If the digit is not K,
       # no need to break
       # String D in A and 0 in B
       else:
           A = A + (str)(D + int('0'))
           B = B + '0'
     
    # Remove leading zeros
    A = removeLeadingZeros(A)
    B = removeLeadingZeros(B)
   
    # Print the answer
    print(A + ", " + B)
   
# Driver code
N = 33673
K = 3
 
findPairs(N, K)
 
# This code is contributed divyeshrabadiya07

C#

// C# implementation of the above approach
using System;
 
class GFG{
  
static String removeLeadingZeros(String str)
{
      
    // Count leading zeros
    int i = 0;
    int n = str.Length;
      
    while (str[i] == '0' && i < n)
        i++;
  
    // It removes i characters
    // starting from index 0
    str = str.Substring(i);
  
    return str;
}
  
static void findPairs(int sum, int K)
{
  
    String A, B;
    A = "";
    B = "";
  
    String N = String.Join("", sum);
    int n = N.Length;
  
    // Check each digit of the N
    for(int i = 0; i < n; i++)
    {
       int D = N[i] - '0';
         
       // If digit is K break it
       if (D == K)
       {
           int D1, D2;
           D1 = D / 2;
             
           // For odd numbers
           D2 = D / 2 + D % 2;
             
           // Add D1 to A and D2 to B
           A = A + (char)(D1 + '0');
           B = B + (char)(D2 + '0');
       }
         
       // If the digit is not K,
       // no need to break
       // String D in A and 0 in B
       else
       {
           A = A + (char)(D + '0');
           B = B + '0';
       }
    }
      
    // Remove leading zeros
    A = removeLeadingZeros(A);
    B = removeLeadingZeros(B);
  
    // Print the answer
    Console.Write(A + ", " + B + "\n");
}
  
// Driver code
public static void Main(String[] args)
{
    int N = 33673;
    int K = 3;
  
    findPairs(N, K);
}
}
 
// This code is contributed by sapnasingh4991

Javascript

<script>
 
// JavaScript implementation of
// the above approach
 
function removeLeadingZeros(str)
{
    // Count leading zeros
    var i = 0;
    var n = str.length;
    while (str[i] == '0' && i < n)
        i++;
 
    return str;
}
 
function findPairs(sum, K)
{
 
    var A, B;
    A = "";
    B = "";
 
    var N = (sum.toString());
    var n = N.length;
 
    // Check each digit of the N
    for (var i = 0; i < n; i++) {
 
        var D = N[i] - '0';
 
        // If digit is K break it
        if (D == K) {
            var D1, D2;
            D1 = parseInt(D / 2);
 
            // For odd numbers
            D2 = parseInt(D / 2) + D % 2;
 
            // Add D1 to A and D2 to B
            A = A +
            String.fromCharCode(D1 + '0'.charCodeAt(0));
             
            B = B +
            String.fromCharCode(D2 + '0'.charCodeAt(0));
        }
 
        // If the digit is not K,
        // no need to break
        // string D in A and 0 in B
        else {
            A = A +
            String.fromCharCode(D + '0'.charCodeAt(0));
            B = B + '0';
        }
    }
 
    // Remove leading zeros
    A = removeLeadingZeros(A);
    B = removeLeadingZeros(B);
 
    // Print the answer
    document.write( A + ", " + B );
}
 
// Driver code
var N = 33673;
var K = 3;
findPairs(N, K);
 
</script>
Producción: 

11671, 22002

 

Complejidad del tiempo: O(M)  
Espacio auxiliar: O(M) 
Aquí, M es el número de dígitos en N.
 

Publicación traducida automáticamente

Artículo escrito por sri_srajit y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *