题解:一眼懂
2025-06-25 20:45:19
发布于:江苏
75阅读
0回复
0点赞
#include<iostream>
using namespace std;
long long n,m,d[25],awa[25],num,t;//d:标记每次是2的几次幂 awa:10^7以下2的次幂
int main(){
awa[1]=2;
for(int i=2;i<=25;i++){//打表二的次幂
awa[i]=awa[i-1]*2;
}
cin>>n;
t=n;//替身一个
if(n%2==0){//为偶数再看
int j=23;//10^7以下最大的是2^23次幂
while(num!=n){//不为n就继续拆
if(j<=0){//<=0代表能拆的23个次幂都用完了,自然不能优拆
cout<<-1;
return 0;
}
if(awa[j]<=t){//如果当前2^j<=t就可以执行
num+=awa[j];//累加一下
d[++m]=j;//记录一下
t-=awa[j];//累减一下(代表剩下的可拆大小)
}
j--;//每次都减保证次幂不同
}
}
else{//不为偶数肯定无法优拆,只有2^0=1才可能是奇数,而0不是正整数
cout<<-1;
return 0;
}
for(int i=1;i<=m;i++){
cout<<awa[d[i]]<<" ";//输出二的记录次幂
}
}
如果还做不懂顺着网线来c我(bushi)
全部评论 1
6
2025-06-25 来自 天津
0尽量往简单的写了才能看懂,别笑QAQ
2025-06-26 来自 江苏
0哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
2025-06-26 来自 天津
0。
2025-06-26 来自 江苏
0
有帮助,赞一个