1 条题解
-
0
题意
给定一个不大于的正整数,将其拆分成若干个2的正整数次幂的和,然后从大到小输出。如果做不到就输出
-1.解题思路
首先可以发现,如果这个数是奇数,那么它拆分的结果中一定有
1,一定不存在优秀的拆分;反之,如果是偶数就一定存在。 2的若干次幂可以用二进制中的某一位为1其余位为0来表示,比如8是,其二进制表示是1000,可以发现只有第4位是1。6可以拆分为4+2,其二进制表示是110,可以发现2的不同次幂的数相加在一起在二进制表达里不会产生进位。因此我们只需要知道输入的数用二进制表示时哪些位是1,再把仅有这一位是1的二进制数转为十进制数输出即可。代码实现
#include<bits/stdc++.h> using namespace std; int main(){ int i,c=8388608;cin>>i;//8388608是比10^7小的最大的2的正整数次幂 if(i&1)cout<<-1; else{ while(c>1){ if(i&c)cout<<c<<' '; c>>=1; } } return 0; }
信息
- ID
- 2220
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 3
- 上传者