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