放球

题目描述:

把 m(<2000) 个球放入编号为 0,1,2...,k-1 的 k 个盒中(m<2^k)要求第 i 个盒内必须放 2 ^ i只球。如果无法满足这一条件,就一个不放,求出放球的具体方案。

 

输入:

一个整数m。

 

输出:

每个盒中对应的球的数。

 

样例输入:

5

 

样例输出:

0:1
1:0
2:4

 

注意:这道题和放苹果是完全不一样的……(别以为把苹果改成球是一样的……)
分析一下题:
有一个点要注意,二进制数的每一位都等于对应的10进制的2^i(i从0开始),所以可以把这道题看成是一个二进制就非常简单了:

 #include<cstdio>
    int n;
    int main(){
        scanf("%d",&n);
        for (int i=0;i<=11;i++){
        if ((n&(1<<i))!=0) {
            printf("%d:%d\n",i,1<<i);
            n-=1<<i;
        }
        else printf("%d:0\n",i);
        if (n==0) break;
    }
    return 0;
    }

<<这个是位数右移(以前讲过,将来也会讲的),就相当于/2,是二进制中的特殊表达方法。
这还有一个正常清真版的:

#include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    int zxy(int a,int b,int c)
    {
    if(a>b)
    return c>b;
    return a<c;
    }
    #define BY Zhoier
    using namespace std;
    int main()
    {
    int i=0,k,n=1;
    scanf("%d",&k);
    while (k != 0)
    {
        printf("%d:%d\n",i,k % 2 * n);
        n *= 2;
        i++;
        k /= 2;
    }
    return 0;
    }

不知道从什么时候起喜欢写一些没用的东西了(。・∀・)ノ゙

posted @ 2017-12-19 20:15  Zhoier  阅读(247)  评论(0编辑  收藏  举报