数据结构练习 - T004

放球

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;
}

posted @ 2021-08-30 21:46  Wreng  阅读(43)  评论(0编辑  收藏  举报