题意;
给你两个数n,m,让你看里面有多少个round数,(包括m,不包括n)
round 数是对应的二进制数中0比1的个数多
思路:
1.0 杨辉三角
2.0 分阶层去算(不同的数位)1,10,100,1000,这样是4个阶层,先算出p(二进制的数的长度)的所有的,然后再算和p相同长度,但是比该数小的round数
CODE
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
int Cn[33][33];
int a[1100],b[1100];
void YH()///构建杨辉三角
{
int i,j;
for(i=0; i<=32; ++i)
{
Cn[i][0]=Cn[i][i]=1;
}
for(i=2; i<=32; ++i)
{
for(j=1; j<i; ++j)
{
Cn[i][j]=Cn[i-1][j-1]+Cn[i-1][j];
}
}
}
int round(int p)
{
int i, j;
int ans = 0;
for(i = 2; i < p; i++)///p位数之前的那些
{
for(j =(i+1)/2; j < i; j++)
{
ans+=Cn[i-1][j];
}
}
int k=0;///统计0的个数
int ki = (p+1)/2;///至少要这些个0
for(i = p-2; i >= 0; i--)///和p位数在同一个阶层
{
if(a[i] == 1)
{
int mi = ki-k-1;///后面至少需要这些0,才是round数
for(; mi <= i; mi++)
ans+=Cn[i][mi];
}
else
k++;
}
return ans;
}
int main()
{
YH();
int n, m;
while(~scanf("%d%d",&n,&m))
{
scanf("%d%d",&n,&m);
int p = 0, q = 0;
m++;///要m那个数,不要n
while(n)///转化为二进制
{
a[p++] = n%2;
n = n/2;
}
int ans = 0, num = 0;
ans = round(p);///n之前的round数
while(m)
{
a[q++] = m%2;
m = m/2;
}
num = round(q);///包括m在内的round数
printf("%d\n",num-ans);
}
return 0;
}