放球
题目描述:
把 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; }
不知道从什么时候起喜欢写一些没用的东西了(。・∀・)ノ゙
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号