数据结构练习

放球

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
");
   }else{
        while (m){
            r = m & 1;
            // printf("m=%d, r=%d
", m,r);
            if (r){
                printf("%d ", i);
            }
            i ++;
            m >>= 1;
        }
        printf("
");
   }
    return 0;
}

原文地址:https://www.cnblogs.com/wreng/p/15208022.html