有这样的一道题:
有一串奇怪数列如下:1 2 -3 4 -5 -6 -7 8 -9 ...
即从1-n,碰到2的次方倍则显正,其他则是负数。(2的整次方包括:1,2,4,8,16,32,64,128,....)
现在给你一个n,求出,这个数列的和。
直接来判断一个数是不是2的整数次方并不好判断,此时我们可以用位运算来快速解决。
我们把2的整数次方的数化成一个二进制数,会发现,所有这样的二进制数第一个数都是1,后面的数都是0;而2^n-1化成二进制数第一个数都是0,后面的数都是1。即if((i&(i-1))==0) 若if里面为真,则i就是2的整数次方。
所以这道题可以用下面的代码AC:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,sum=0;
for(i=1;i<=n;i++)
{
if((i&(i-1))==0)
sum=sum+i;
else
sum=sum-i;
}
printf("%d\n",sum);
}
return 0;
}