C ++中给定范围[L,R]中所有元素的XOR
在这个问题中,我们得到两个整数L和R来表示一个范围。我们的任务是找到[L,R]范围内所有元素的异或。
让我们举个例子来了解这个问题,
输入-L = 3,R = 6
说明-3 ^ 4 ^ 5 ^ 6 =
为了解决这个问题,我们将找到R的MSB。答案的MSB将不大于R。现在,我们将找到从0到MSB的位数的奇偶校验。
现在,要找到第i个位的奇偶校验计数,我们可以看到第i个位的状态将在每第2个数字上变化。L到R范围内的所有ith位设置都相同。这样做时,会出现两种情况-
情况1(i!= 0) -检查L的第i位。如果已设置,则检查L和L + 2i之间的数字的奇偶校验计数。如果设置了L的第i位,则L为奇数,则计数为奇数,否则为偶数。现在,我们将移至R,并确定R-2i和R之间的许多元素的计数奇偶性,并采用相同的方法。
其余所有整数都不会考虑,因为它们甚至会生成设置了第i位的整数。
情况2(i = 0) -在这里,我们将不得不请看以下情况-
情况2.1 -L和R均为奇数,计数设置为第0位的整数的个数为(RL)/ 2 + 1。
情况2.2-否则,计数将舍入为(R-L + 1)/ 2个数。
示例
显示我们解决方案实施情况的程序,
#include <iostream>using namespace std;
int findMSB(int x) {
int ret = 0;
while ((x >> (ret + 1)) != 0)
ret++;
return ret;
}
int XOREleInRange(int L, int R) {
int max_bit = findMSB(R);
int mul = 2;
int ans = 0;
for (int i = 1; i <= max_bit; i++) {
if ((L / mul) * mul == (R / mul) * mul) {
if (((L & (1 << i)) != 0) && (R - L + 1) % 2 == 1)
ans += mul;
mul *= 2;
continue;
}
bool oddCount = 0;
if (((L & (1 << i)) != 0) && L % 2 == 1)
oddCount = (oddCount ^ 1);
if (((R & (1 << i)) != 0) && R % 2 == 0)
oddCount = (oddCount ^ 1);
if (oddCount)
ans += mul;
mul *= 2;
}
int zero_bit_cnt = zero_bit_cnt = (R - L + 1) / 2;
if (L % 2 == 1 && R % 2 == 1)
zero_bit_cnt++;
if (zero_bit_cnt % 2 == 1)
ans++;
return ans;
}
int main(){
int L = 1, R = 4;
cout<<"The XOR of all element within the range ("<<L<<", "<<R<<") is : "<<XOREleInRange(L, R);
return 0;
}
输出结果
The XOR of all element within the range (1, 4) is : 4
以上是 C ++中给定范围[L,R]中所有元素的XOR 的全部内容, 来源链接: utcz.com/z/351443.html