Étant donné l'entier A et B, trouvez l'entier X de sorte que:
- A, B <2 * 1e18
- A xou X = B + X
Je doute fortement qu'il soit possible de résoudre cette équation en utilisant les mathématiques. C'est un problème de codage que j'ai rencontré il y a 3 ans et même maintenant, je ne peux pas le résoudre moi-même.
Mon code jusqu'à présent: (c'est la solution de force brute)
#include <iostream>
using namespace std;
int main()
{
unsigned long long a, b;
cin >> a >> b;
for (unsigned long long x = 1; x < max(a, b); x++) {
unsigned long long c = a ^ x;
unsigned long long d = b + x;
if (c == d) {
cout << x << endl;
break;
return 0;
}
}
cout << -1; //if no such integer exists
return 0;
}
a xor b = a + b mod 2
. Essayez de réfléchir à cette équivalence pendant un petit moment.mod 2
comme dans le mathématique (mod 2), ie 3 === 7 (mod 2). Le fait est que vous pouvez découvrir une équation pour le premier bit de X, puis passer au bit suivant où (en respectant le report) vous obtenez une équation pour le deuxième bit, etc., comme la réponse de Daniel.Réponses:
Notez cela
A + X == (A xor X) + ((A and X)<<1)
. Donc:Et nous avons:
Si la condition est remplie, pour tout entier Y qui n'a pas de bits définis dans A, (((A - B) >> 1) ou Y) est une solution. Si vous ne voulez qu'une seule solution, vous pouvez utiliser ((A - B) >> 1), où Y = 0. Sinon, il n'y a pas de solution.
la source
A xor X
c'est "addition sans report", et((A and X)<<1)
"report dans l'addition". PuisqueA + X
c'est "addition avec report", la première équation a du sens.(A and X)<<1
est fondamentalement2*(A and X)
et parce que cela est égal àA-B
cela dit que le problème peut avoir une solution uniquement si A et B sont tous les deux impairs ou les deux événements.Ce n'est pas très difficile, il suffit de penser petit: supposons que nous écrivons
A
,B
etX
en binaire, et queAᵢ
la valeur corresponde au bit 2 most le plus à droite .Nous savons que:
Aₒ ⊕ Xₒ = Bₒ + Xₒ
.Prenons un exemple pour découvrir comment évaluer cela: A = 15 et B = 6. Conversion en binaire:
Maintenant, nous avons quelques possibilités. Analysons les bits les plus à droite de A et B:
Nous savons que
d
cela ne peut être que 0 ou 1, donc:Il est à noter que XOR se comporte comme une somme binaire (à la différence près que XOR ne crée pas de report pour la somme de bits suivante):
il ne sera donc pas toujours possible de trouver un X satisfaisant
A ⊕ X = B + X
, car il n'y a pas de valeurd
satisfaisante1 + d = 0 + d
.Quoi qu'il en soit, si X existe, vous pouvez simplement le découvrir de cette façon, de droite à gauche, en le recherchant petit à petit.
EXEMPLE DE TRAVAIL COMPLET
A = 15, B = 7:
Ici, d = 0 et d = 1 s'appliquent, alors quoi? Nous devons vérifier le bit suivant. Supposons que d = 1:
dans ce cas, d doit être égal à 0.
mais qu'en est-il de b? nous devons vérifier le bit suivant, comme toujours:
et maintenant, pour
a
:ici
a
peut être 0 et 1, mais il doit être 0, afin d'éviter un report dans la sommeB + X
.Alors,
X = 0 1 0 0
donc X = 4.CODE
Vous pouvez le tester ici .
la source