邪修做法
2026-07-16 22:32:45
发布于:浙江
15阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
long long a[10101];
int main(){
int n, len = 1;
bool ztj = 0;//判断的状态机
cin>>n;
int q = n;
long long ans = 17179869184;//这是2的34次方,就是卡那个测试点😅
if(n % 2 != 0){//不是偶数那直接OUT
ztj = 0;
cout<<"-1";
return 0;
}
while(q > 0){//开始判断
if(ans <= q){//因为ans过大,so要先判断在这个数的承受范围内(比这个数小)
//such as(例如) 6,他可拆分为2的2次方 and 2的1次方
a[len++/*方便输出,计算长度*/] = ans;
q -= ans;//减去这个数,可以算是逆向思维吧🤭
}
ans /= 2;//把ans给削次方
}
if(q == 0) ztj = 1;
else ztj = 0;
if(ztj == 1){
for(int i = 1;i < len;i++){
cout<<a[i]<<" ";//输出数组
}
}
else cout<<-1;//输出-1
return 0;
}
记得点赞领罐头哦!
全部评论 2
按我这个代码,包过!!!
else{ string s; while(n!=0){ s+=(n%2)+'0'; n/=2; } for(int i=s.size()-1;i>=0;i--){ if(s[i]=='1'){ cout<<int(pow(2,i))<<' '; } } }这个else当然是偶数情况下
16小时前 来自 广东
0只要是偶数都有优秀的拆分,这个ztj变量是不是有点多余
16小时前 来自 广东
0












有帮助,赞一个