在这个问题上,我们得到一个整数n。我们的任务是创建一个程序,以查找从i = 0到n的整数计数,其中sum等于XOR,即(n + i)=(n ^ i)。
输入: n = 4
输出 4
解释:
考虑i从0到n的所有值,
i = 0,4 + 0 = 4,4 ^ 0 = 4
i = 1,4 + 1 = 5,4 ^ 1 = 5
i = 2,4 + 2 = 6,4 ^ 2 = 6
i = 3,4 + 3 = 7、4 ^ 3 = 7
i = 4、4 + 4 = 8、4 ^ 4 = 0
计数= 4
一个简单的解决方案是找到n和i之和与n和i的异或的值。比较这两个值,然后计算它们相等的值。
步骤1: 循环搜索从i = 0到n的所有值。
步骤1.1: 找到(n + i)的值。
步骤1.2: 找到(n ^ i)的值。
步骤1.3: 比较在步骤1.1和1.2中找到的值。
步骤1.4: 如果相等,则增加计数。
步骤2: 打印计 数值。
#include <iostream>
using namespace std;
int main() {
int n = 5;
int counter = 0;
for(int i=0; i<=n; i++ )
if ( (n+i) == (n^i) )
counter++;
cout<<"总和与XOR相等的整数的计数为 "<<counter;
return 0;
}总和与XOR相等的整数的计数为 2
该方法是好的,但是他们可以更好地解决该问题,这是基于以下事实:
如果n ^ i = n + i,则n&i = 0。
如果n&i = 0,那么我们需要两个数字具有相反的置位和未置位位。我们需要计算这些值。这是一个执行此操作的程序,
#include <iostream>
using namespace std;
int countValuesWithEqualSumXOR(int n) {
int countUnSetBits=0;
while (n) {
if ((n & 1) == 0)
countUnSetBits++;
n=n>>1;
}
return 1 << countUnSetBits;
}
int main()
{
int n = 6;
cout<<"总和与XOR相等的整数的计数为 "<<countValuesWithEqualSumXOR(n);
return 0;
}总和与XOR相等的整数的计数为 2