给出一个整数,将xor值从零计算到数字

时间:2015-03-06 03:45:06

标签: c++ algorithm xor

计数" 0 xor 1 xor 2 xor ...... xor N",例如,我给第三个作为N,程序应该返回0,现在我将我的代码放到在线jundge,结果是时间超限,我几乎找不到错误的地方,任何人都可以给我一些建议,在此先感谢。

 long long xorSum(long long  x) {   
   long long j =0;//we supposed x is big enough ,less than 10^18.
   for (long long i=1 ;i<=x;i++) {
     j  ^= i;
   }
    return j;
  }

1 个答案:

答案 0 :(得分:3)

简单逻辑,适用于O(1)

long long xorSum(long long k) {
    switch (k % 4) {
        case 0: return k;
        case 1: return 1;
        case 2: return k + 1;
        case 3: return 0;
    }
}

证明,使用归纳法:从1到4,我们可以很容易地看出逻辑是正确的。假设上述逻辑是正确的,直到xx % 4 = 3,因此当前总和为0.

  • x + 1 (x + 1) % 4 = 0开始,所以二进制表示总是xxx00xxx表示任何二进制数),所以xor和最后一个总和,我们将为0得到xxx00
  • 下一个号码的格式为xxx01 - &gt; xor将为xxx00 xor xxx01 = 00001
  • xxx01xxx10 - &gt; xor将为00001 xor xxx10 = xxx11
  • xxx10xxx11 - &gt; xor将是xxx11 xor xxx11 = 00000 - &gt;请注意xxx11 % 4 = 3,它会重新启动整个序列并完成校对。