咱就是说啊,特别简单的一道题,身为一个可(扭)爱(曲)的社畜小学生,也是肥肠热心啊~
咳咳,不玩了
先看提示~
第一个 20%:n≤10
打表就可以了~
第二个 20%:n 是奇数
n 被分解为了若干个不同的 2的正整数次幂,所以,n不可能是奇数,也不会是0
反之,如果n为偶数,那它就一定存在优秀的拆分~
第三个 20%:保证 n 是 22 的正整数次幂
那就直接原地枚举,乱写~
对于 80% 的数据:n≤1024,框定了枚举的范围 :
2的10次方~
我们可以做一个 if 语句来判断n是不是奇数,如果是,那么就输出-1:
if(n % 2 != 0){
printf("-1");
}
当然,你也可以用 n&2 的方法:
if(n & 1){
printf("-1");
}
这题当然用不着二进制,我们可以直接循环判断
好了,不废话了,代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,s = 1 << 24;//将s 赋值为1的24次方
scanf("%d",&n);
if(n & 1){//判断那些不为偶数的,以及去除那些七里八里的~
printf("-1");
}else{
while(s){
if(n & s)
printf("%d ",s);
s >>= 1;//向左移位1~
}
}
return 0;
}