非正经题解
2025-08-10 09:17:13
发布于:广东
8阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll mi[30] = {0,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,
65536,131072,262144,524288,1048576,2097152,4194304,8388608,
16777216};//储存2的幂(可以写成函数自动定义别学我手搓2的幂())
vector<ll> ans;
ll bs(ll n){//二分遍历mi数组
ll ans = 0;
int l = 1,r = 24;
while(l < r){
int mid = (l + r) / 2;
if(mi[mid] <= n){
ans = mid;
l = mid + 1;
}else r = mid - 1;
}
return ans;
}
int main(){
cin >> n;
if(n % 2) cout << -1;//是奇数则输出-1
else{
int a = bs(n);
for(int i = a + 1;i >= 1;i--){
if(mi[i] <= n){
ans.push_back(mi[i]);//把mi数组中小于n的最大的数字存储进ans
n -= mi[i];//n减去上面那个数字
}
}
for(int i = 0;i < ans.size();i++) cout << ans[i] << " ";//循环遍历输出
}
return 0;
//灵感来源于进制转换的一种方法,集训营考试的时候突发奇想写了这个东西交上去然后AC了
}
//Q=cm∆t
全部评论 1
正经的在这里
本质就是转化为二进制然后把是1的位置的2的幂输出#include<bits/stdc++.h> using namespace std; int n,ans[10005],idx = 0; int main(){ cin >> n; if(n % 2 == 1){ cout << -1; return 0; } while(n > 0){ ans[idx] = n % 2; idx++; n /= 2; } for(int i = idx - 1;i >= 0;i--){ if(ans[i] == 1) cout << (int)(ans[i]*pow(2,i)) << " "; } return 0; }
2025-08-10 来自 广东
0
有帮助,赞一个