题目链接
做题情况
13min35s AC
代码及题解
简单题,找找规律即可
#include<iostream>
using namespace std;
/*
找规律发现,如果想知道一个十进制数转化为二进制数后
末尾有多少个0,就看这个二进制数最多能被谁整除
这个除数需要是2的多少次方
如24-->11000 最多被8(2^3)因此末尾有3个零
因此我们得出了,十进制到二进制零的方法。
下面讨论一下如何通过乘积的形式得到乘积和能被谁整除
即6*7*8*9*10这样的,最多能被谁整除
那么就找这些数中有多少个2就好
6=2*3(1个2)
7(无)
8=2*2*2(3个2)
9(无)
10=2*5(1个2)
一共5个,因此二进制末尾就是5个0
注意特殊数据的判断:
*/
int n,m;
int fun(int n){
//求n有多少个2
int num=0;
while(n%2!=1){
num++;
n/=2;
}
return num;
}
int main(){
while(cin>>n>>m){
long long ans=0;
if(n==n&&m==0)
exit(0);
for(int i=n-m+1;i<=n;i++){
ans+=fun(i);
}
cout<<ans<<endl;
}
return 0;
}