在这个问题上,我们得到一个整数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