题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5747
我们首先把这个数换成以二进制表示,很明显,在m位之前的,有1的那位我们就+1,没有的就不加。在m范围外的,很明显,我们用第m位去凑需要的数量最小。
#include <cstdio>
#include <cstring>
int main()
{
int n,m;
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n,&m);
int num = 0;
for(int i=31; i>=0; i--)
{
if(n&(1<<i))
{
if(i > m) num += 1<<(i-m);
else num++;
//printf("%d %d\n", i, num);
}
}
printf("%d\n", num);
}
}