数位统计的题,计算a到b之间的Round Numbers可以转化为sum(b)-sum(a-1);
在计算sum(b),先统计位数小于b的Round Numbers的个数,在计算同位时要递推下去做,具体可参考代码。
#include <stdio.h>
#include <string.h>
#include <math.h>
int a,b;
int p[40],c[40][40];
void init(){
int i,j;
for(i=0;i<=32;i++)
c[i][0]=c[i][i]=1;
for(i=2;i<=32;i++)
for(j=1;j<i;j++)
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
int solve(int num){
int i,j,k,cur=1;
if(num==0 || num==1)
return 0;
int n=0;
while(num){
p[cur++]=num%2;
if(num%2==0)
n++;
num=num>>1;
}
cur--;
int sum=0;
if(n>=(cur-1)/2+1) //(cur-1)/2+1为cur位数最少的0
sum=1;
for(i=2;i<=cur-1;i++){
for(j=(i-1)/2+1;j<=i-1;j++)
sum+=c[i-1][j];
}
int z=0;
for(i=cur-1;i>=1;i--){
if(p[i]){
if((cur-1)/2+1-z-1<=0)
j=0;
else
j=(cur-1)/2+1-z-1;
for(;j<=i-1;j++)
sum+=c[i-1][j];
}
else
z++;
}
return sum;
}
int main(){
scanf("%d %d",&a,&b);
init();
printf("%d\n",solve(b)-solve(a-1));
}