http://ac.jobdu.com/problem.php?pid=1466
思路:例:(10,5) 10*9*8*7*6=30240,其二进制,末尾5个0,正好等于,10,9,8,7,6的二进制末尾
0的个数的和。10的二进制,1010,1个0;8,1000,3个0...
优化:1、j%2==0 可以变为:( j&1 )==0
2、j/=2 可以变为 j>>=1
#include <stdio.h>
int a[10005]; //保存从1~10000所有数的二进制末尾0的个数
int main()
{
int i,j;
for (i=1;i<=10000;i++)
{
a[i]=0;
j=i;
while (j%2==0)
{
a[i]++;
j/=2;
}
}
int n,m;
while (scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
int ans=0;
for (i=0;i<m;i++)
{
ans+=a[n-i]; //若10,依次加上10,9,8,7,6的二进制末尾0的个数
}
printf("%d\n",ans);
}
return 0;
}