给定整数A和B,找到整数X以便:
- A,B <2 * 1e18
- A xor X = B + X
我非常怀疑是否可以使用数学方法来解决这个方程。这是我3年前遇到的编码问题,即使现在我自己也无法解决。
到目前为止,我的代码:(这是蛮力解决方案)
#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;
}
@Someprogrammerdude如果a和b是布尔变量,即0或1,而xor是布尔xor。与按位异或的关系是什么?
—
John Kugelman
首先,我认为在这里使用蛮力是必经之路,除非您想编写可以证明更通用的方程式的东西。考虑到您必须测试您的代码以确保它是正确的,并且最简单的方法是针对蛮力算法进行测试,但是您可以首先使用蛮力。另一方面,应用数学将最终使不必运行任何代码。
—
idclev 463035818
@molbdnilo哦,评论之一建议a xor b = a + b mod 2,我认为它也指整数。我将删除帖子的这一部分。
—
AAaAa
@JohnKugelman他的意思是
—
Max Langhof
mod 2
数学上的(mod 2),即3 === 7(mod 2)。关键是您可以发现X的第一位的等式,然后继续到下一位(尊重进位),获得第二位的等式,依此类推,就像丹尼尔的答案。
a xor b = a + b mod 2
。尝试考虑一下等效性。