Encuentra dos enteros A y B tales que A ^ N = A + N y B ^ N = B + N

Dado un entero no negativo N , la tarea es encontrar dos enteros A (mayor entero menor que N) y (menor entero mayor que N) tales que A + N = A ^ N y B + N = B ^ N
Ejemplos: 
 

Entrada: N = 5 
Salida: A = 2 y B = 8 
2 + 8 = 2 ^ 8 = 10
Entrada: N = 10 
Salida: A = 5 y B = 16 
5 + 16 = 5 ^ 16 = 21 
 

Enfoque: Vamos a encontrar A y B de forma independiente. Para resolver este problema tenemos que usar la propiedad, x + y = x^y + 2 * (x & y) 
Dado que el problema establece que xor sum es igual a la suma dada, lo que implica que su AND debe ser 0. 
 

  • Encontrar A: N se puede representar como una serie de bits de 0 y 1. Para encontrar A, primero tendremos que encontrar el bit más significativo de N que está establecido. Dado que A & N = 0, los lugares donde N ha establecido un bit, para esos lugares haremos que los bits de A no estén establecidos y para los lugares donde N tenga un bit no establecido, haremos que ese bit se establezca para A, ya que queremos maximizar A Esto lo haremos para todos los bits desde el más significativo hasta el menos significativo. Por lo tanto obtendremos nuestra A.
  • Encontrar B: Encontrar B es fácil. Sea i la posición del bit establecido más a la izquierda en 1. Queremos que B sea mayor que N, también queremos que B & N =0. Por lo tanto usando estos dos hechos B será siempre (1<< (i+1)).

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

CPP

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
#define MAX 32
 
// Function to find A and B
void findAB(int N)
{
    bitset<MAX> arr(N), brr(N);
 
    // To store the leftmost set bit in N
    int leftsetN = -1;
    for (int i = MAX - 1; i >= 0; --i) {
        if (arr[i] == 1) {
            leftsetN = i;
            break;
        }
    }
 
    // To store the value of A
    int A = 0;
    for (int i = leftsetN; i >= 0; --i) {
 
        // If the bit is unset in N
        // then  we will set it in A
        if (arr[i] == 0) {
            A |= (1 << i);
        }
    }
 
    // To store the value of B
    int B = 0;
 
    // B will be (1 << (leftsetN + 1))
    B = 1 << (leftsetN + 1);
 
    // Print the values of A and B
    cout << "A = " << A << " and B = " << B;
}
 
// Driver code
int main()
{
    int N = 5;
 
    findAB(N);
 
    return 0;
}
Producción: 

A = 2 and B = 8

 

Complejidad de tiempo: O (MAX)

Espacio Auxiliar: O(N)

Publicación traducida automáticamente

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