Encuentra dos números a partir de su suma y XOR | conjunto 2

Dados dos enteros X e Y , la tarea es encontrar los dos enteros que tienen suma X y Bitwise XOR igual a Y .

Ejemplos:

Entrada: X = 17, Y = 13
Salida: 2 15
Explicación: 2 + 15 = 17 y 2 ^ 15 = 13

Entrada: X = 1870807699, Y = 259801747
Salida: 805502976 1065304723

Enfoque ingenuo: consulte la publicación anterior de este artículo para conocer el enfoque más simple para resolver el problema. 

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

Enfoque eficiente: el enfoque anterior se puede optimizar en función de las siguientes observaciones:

A + B = (A ^ B) + 2 * (A y B)
=> X = Y + 2 * (A y B)

Al calcular la suma, si ambos bits son 1 (es decir, AND es 1), el bit resultante es 0 y 1 se agrega como acarreo, lo que significa que cada bit en AND se desplaza a la izquierda por 1, es decir, el valor de AND se multiplica por 2 y añadido.

Reordenando los términos se obtiene la expresión (A&B) = (X – Y) / 2.

Esto verifica la observación anterior. 
 

Existen los siguientes casos:

  • Si X < Y: En este caso, la solución no existe porque (A & B) se vuelve negativa, lo cual no es posible.
  • Si X – Y es impar: En este caso, la solución no existe porque (X – Y) no es divisible por 2.
  • Si X = Y: En este caso, A & B = 0. Por lo tanto, el valor mínimo de A debe ser 0 y el valor de B debe ser Y para satisfacer las ecuaciones dadas.
  • De lo contrario: A&B = (X – Y)/2 se cumple, solo cuando ((X – Y)/2) & Y es igual a 0. Si es cierto, A = (X – Y)/2 y B = A + Y. De lo contrario, A = -1 y B = -1.

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 to find the value of A and
// B whose sum is X and xor is Y
void findNums(int X, int Y)
{
 
    // Initialize the two numbers
    int A, B;
 
    // Case 1: X < Y
    if (X < Y) {
        A = -1;
        B = -1;
    }
 
    // Case 2: X-Y is odd
    else if (abs(X - Y) & 1) {
        A = -1;
        B = -1;
    }
 
    // Case 3: If both Sum and XOR
    // are equal
    else if (X == Y) {
        A = 0;
        B = Y;
    }
 
    // Case 4: If above cases fails
    else {
 
        // Update the value of A
        A = (X - Y) / 2;
 
        // Check if A & Y value is 0
        if ((A & Y) == 0) {
 
            // If true, update B
            B = (A + Y);
        }
 
        // Otherwise assign -1 to A,
        // -1 to B
        else {
            A = -1;
            B = -1;
        }
    }
 
    // Print the numbers A and B
    cout << A << " " << B;
}
 
// Driver Code
int main()
{
    // Given Sum and XOR of 2 numbers
    int X = 17, Y = 13;
 
    // Function Call
    findNums(X, Y);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
    
class GFG{
    
// Function to find the value of A and
// B whose sum is X and xor is Y
static void findNums(int X, int Y)
{
     
    // Initialize the two numbers
    int A, B;
  
    // Case 1: X < Y
    if (X < Y)
    {
        A = -1;
        B = -1;
    }
  
    // Case 2: X-Y is odd
    else if (((Math.abs(X - Y)) & 1) != 0)
    {
        A = -1;
        B = -1;
    }
  
    // Case 3: If both Sum and XOR
    // are equal
    else if (X == Y)
    {
        A = 0;
        B = Y;
    }
  
    // Case 4: If above cases fails
    else
    {
         
        // Update the value of A
        A = (X - Y) / 2;
  
        // Check if A & Y value is 0
        if ((A & Y) == 0)
        {
             
            // If true, update B
            B = (A + Y);
        }
  
        // Otherwise assign -1 to A,
        // -1 to B
        else
        {
            A = -1;
            B = -1;
        }
    }
  
    // Print the numbers A and B
    System.out.print(A + " " + B);
}
    
// Driver Code
public static void main(String[] args)
{
     
    // Given Sum and XOR of 2 numbers
    int X = 17, Y = 13;
  
    // Function Call
    findNums(X, Y);
}
}
 
// This code is contributed by susmitakundugoaldanga

Python

# Python program for the above approach
 
# Function to find the value of A and
# B whose sum is X and xor is Y
def findNums(X, Y):
   
    # Initialize the two numbers
    A = 0;
    B = 0;
 
    # Case 1: X < Y
    if (X < Y):
        A = -1;
        B = -1;
 
    # Case 2: X-Y is odd
    elif (((abs(X - Y)) & 1) != 0):
        A = -1;
        B = -1;
 
    # Case 3: If both Sum and XOR
    # are equal
    elif (X == Y):
        A = 0;
        B = Y;
 
    # Case 4: If above cases fails
    else:
 
        # Update the value of A
        A = (X - Y) // 2;
 
        # Check if A & Y value is 0
        if ((A & Y) == 0):
 
            # If True, update B
            B = (A + Y);
 
        # Otherwise assign -1 to A,
        # -1 to B
        else:
            A = -1;
            B = -1;
 
    # Print the numbers A and B
    print A;
    print B;
 
# Driver Code
if __name__ == '__main__':
   
    # Given Sum and XOR of 2 numbers
    X = 17;
    Y = 13;
 
    # Function Call
    findNums(X, Y);
 
# This code is contributed by shikhasingrajput

C#

// C# program for the above approach
using System;
 
class GFG{
    
// Function to find the value of A and
// B whose sum is X and xor is Y
static void findNums(int X, int Y)
{
     
    // Initialize the two numbers
    int A, B;
  
    // Case 1: X < Y
    if (X < Y)
    {
        A = -1;
        B = -1;
    }
  
    // Case 2: X-Y is odd
    else if (((Math.Abs(X - Y)) & 1) != 0)
    {
        A = -1;
        B = -1;
    }
  
    // Case 3: If both Sum and XOR
    // are equal
    else if (X == Y)
    {
        A = 0;
        B = Y;
    }
  
    // Case 4: If above cases fails
    else
    {
         
        // Update the value of A
        A = (X - Y) / 2;
  
        // Check if A & Y value is 0
        if ((A & Y) == 0)
        {
             
            // If true, update B
            B = (A + Y);
        }
  
        // Otherwise assign -1 to A,
        // -1 to B
        else
        {
            A = -1;
            B = -1;
        }
    }
  
    // Print the numbers A and B
    Console.Write(A + " " + B);
}
    
// Driver Code
public static void Main(String[] args)
{
     
    // Given Sum and XOR of 2 numbers
    int X = 17, Y = 13;
     
    // Function Call
    findNums(X, Y);
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// JavaScript program to implement the above approach
 
// Function to find the value of A and
// B whose sum is X and xor is Y
function findNums(X, Y)
{
 
    // Initialize the two numbers
    let A, B;
 
    // Case 1: X < Y
    if (X < Y) {
        A = -1;
        B = -1;
    }
 
    // Case 2: X-Y is odd
    else if (Math.abs(X - Y) & 1) {
        A = -1;
        B = -1;
    }
 
    // Case 3: If both Sum and XOR
    // are equal
    else if (X == Y) {
        A = 0;
        B = Y;
    }
 
    // Case 4: If above cases fails
    else {
 
        // Update the value of A
        A = (X - Y) / 2;
 
        // Check if A & Y value is 0
        if ((A & Y) == 0) {
 
            // If true, update B
            B = (A + Y);
        }
 
        // Otherwise assign -1 to A,
        // -1 to B
        else {
            A = -1;
            B = -1;
        }
    }
 
    // Print the numbers A and B
    document.write(A + " " + B);
}
 
// Driver Code
 
    // Given Sum and XOR of 2 numbers
    let X = 17, Y = 13;
 
    // Function Call
    findNums(X, Y);
 
</script>
Producción: 

2 15

 

Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por koulick_sadhu 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 *