Suchen Sie bei gegebener Ganzzahl A und B die Ganzzahl X, damit:
- A, B <2 * 1e18
- A x oder X = B + X.
Ich bezweifle sehr, dass es möglich ist, diese Gleichung mit Mathematik zu lösen. Dies ist ein Codierungsproblem, auf das ich vor 3 Jahren gestoßen bin, und selbst jetzt kann ich es nicht selbst lösen.
Mein bisheriger Code: (Dies ist die Brute-Force-Lösung.)
#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
. Versuchen Sie, eine Weile über diese Äquivalenz nachzudenken.mod 2
wie in der Mathematik (Mod 2), dh 3 === 7 (Mod 2). Der Punkt ist, dass Sie eine Gleichung für das erste Bit von X entdecken und dann zum nächsten Bit übergehen können, wo Sie (unter Berücksichtigung des Übertrags) eine Gleichung für das zweite Bit usw. erhalten, wie Daniels Antwort.Antworten:
Beachten Sie das
A + X == (A xor X) + ((A and X)<<1)
. Damit:Und wir haben:
Wenn die Bedingung erfüllt ist, ist für jede ganze Zahl Y, die keine in A gesetzten Bits hat, (((A - B) >> 1) oder Y) eine Lösung. Wenn Sie nur eine Lösung wünschen, können Sie ((A - B) >> 1) verwenden, wobei Y = 0. Andernfalls gibt es keine Lösung.
quelle
A xor X
"Addition ohne Übertrag" und((A and X)<<1)
"Übertragung in der Addition" ist. DaA + X
es sich um "Addition mit Übertrag" handelt, ist die erste Gleichung sinnvoll.(A and X)<<1
ist im Grunde2*(A and X)
und weil dies gleich ist,A-B
heißt es, dass das Problem nur dann eine Lösung haben kann, wenn A und B beide ungerade oder beide Ereignisse sind.Es ist nicht sehr schwer, man muss nur klein denken muß: Angenommen , wir schreiben
A
,B
undX
in binären undAᵢ
ist der Wert auf den äußersten rechten 2 entsprechenden ⁱ Bit.Wir wissen das :
Aₒ ⊕ Xₒ = Bₒ + Xₒ
.Lassen Sie uns anhand eines Beispiels herausfinden, wie dies bewertet werden kann: A = 15 und B = 6. Konvertieren in Binär:
Jetzt haben wir einige Möglichkeiten. Lassen Sie uns die am weitesten rechts liegenden Teile von A und B analysieren:
Wir wissen, dass
d
das nur 0 oder 1 sein kann, also:Es fällt auf, dass sich XOR genau wie eine binäre Summe verhält (mit dem Unterschied, dass XOR keine Übertragung für die nächste Bitsumme erzeugt):
Daher ist es nicht immer möglich, ein X zu finden, das erfüllt
A ⊕ X = B + X
, da es keinen Wert gibtd
, der erfüllt1 + d = 0 + d
.Wenn X existiert, können Sie es auf diese Weise von rechts nach links herausfinden und Stück für Stück finden.
VOLLSTÄNDIGES ARBEITSBEISPIEL
A = 15, B = 7:
Hier gelten sowohl d = 0 als auch d = 1, was dann? Wir müssen das nächste Bit überprüfen. Angenommen, d = 1:
In diesem Fall muss d also 0 sein.
aber was ist mit b? wir müssen wie immer das nächste Bit überprüfen:
und jetzt für
a
:hier
a
kann 0 und 1 sein, aber es muss 0 sein, um eine Verschleppung in der Summe zu vermeidenB + X
.Dann ist
X = 0 1 0 0
also X = 4.CODE
Sie können es hier testen .
quelle