放球
m 个球放入编号为 0,1,2,…,k-1 的 k 个盒中(\(m<2k\))要求第 \(i\) 个盒内必须放 \(2^i\) 只 球。如果无法满足这一条件,就一个不放,求出放球的具体方案。
输入 :m k
输出:若能放进去,则输出放入球的编号(空格隔开),否则输出-1
思路:本质就是一个将十进制转化为二进制的问题。
#include <bits/stdc++.h>
using namespace std;
int main()
{
unsigned int m, r, i, k;
scanf("%d %d", &m, &k);
i = 0;
/*方法1:
m % 2 得到的余数为二进制的末位数
m /= 2 再右移
*/
if (m > (1<<(k-1))){
printf("-1\n");
}else{
while (m){
r = m & 1;
// printf("m=%d, r=%d\n", m,r);
if (r){
printf("%d ", i);
}
i ++;
m >>= 1;
}
printf("\n");
}
return 0;
}