下面的文章写得相当好。 http://jay23jack.blog.163.com/blog/static/317951942009127105939814/ 虽然实现不一样,但是思路借鉴了他的。写起来挺烦的,好像自己在运算一样。 #include<iostream> using namespace std; int c[35][35]; int binary[35],len; void init(int x) { int i,j; len=0; int tx=x; while(tx) { len++; tx=tx>>1; } for(i=len;i>=1;i--) { binary[i]=x&1; x=x>>1; } } int solve(int x) { int ans=1,i,j,k=1; if(x<=2) return 0; if(x==3) ans=0; for(i=3;i<len;i++) for(j=0;j<=i-1;j++) if((j+1)*2<=i) ans+=c[i-1][j]; for(i=2;i<=len;i++) { while(binary[i]==0&&i<=len) i++; for(j=0;j<=len-i;j++) if((j+k)*2<=len) ans+=c[len-i][j]; k++; } return ans; } int main() { int x,y,i,j,rx,ry; for(i=0;i<35;i++) c[i][0]=c[i][i]=1; for(i=1;i<35;i++) for(j=1;j<i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1]; scanf("%d%d",&x,&y); init(x); rx=solve(x); init(y+1); ry=solve(y+1); printf("%d/n",ry-rx); return 0; }