思路
这道题有一点难度,我们可以打表,将小于等于n的2的正整数次幂进行列举(可以用cmath库里的pow函数,用法:变量名=pow(2,i),表示2的i次方)。然后从最后一个次幂开始判断:是否能被减去,若能被减,则存储到数组中,指针(也就是当前存储的值的数)++,再判断是否还能被减,否则判断下一个次幂(次幂最多也不会超出int的范围,所以可以用24(int中最大的2的次方数)来当i,判断大于等于1,i--)如果还有值,则输出-1,否则输出数组。
代码
#include<iostream>
#include<cmath>
using namespace std;
long long n,cnt;
long long a[30],p[100];
int main(){
cin>>n;
for(int i=1;i<=24;i++){
if(pow(2,i)<=n){//求出2的i次方
a[i]=pow(2,i);
}
}
for(int i=24;i>=1;i--){//题目中说明输出从大到小
while(n>=a[i]&&a[i]!=0){//while循环判断n还能被剪掉么
n-=a[i];
p[++cnt]=a[i];//cnt从0开始,所以先+1,再从这里存值
//如果cnt=1,那么改为cnt++
}
}
if(n){//如果n有值,那么会返回true
cout<<-1<<endl;
return 0;
}
for(int i=1;i<=cnt&&p[i]!=0;i++){
cout<<p[i]<<" ";
}
return 0;
}
103

被折叠的 条评论
为什么被折叠?



