简单题解
2026-10-01 15:48:15
发布于:广东
8阅读
0回复
0点赞
点这里
不难理解,这道题要把一个数拆成二进制形式,且个位不得为一。
也就是说,这个数要是奇数。那我们就先处理是否为奇数
先把基本框架写了
#include<bits/stdc++.h>
using namespace std;
int main(){
return 0;
}
再定义和输入n
int n;
cin>>n;
判断是否为奇数
if(n%2){
cout<<-1;
return 0;
}
数据范围n<10000000,可以从2的19次方开始检查,如果比他大就减去这个数,不然就跳过。
这里直接把2的1-19次方记录到数组里
int a[100]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288};
这里就用upper_bound-1来找最大的,每找到一个就把这个输出
while(n){
int x=upper_bound(a,a+30,n)-a-1;
n-=a[x];
cout<<a[x]<<' ';
}
最后组合一下就得到了正解代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[100]={2,4,8,16,32,64,128,256,512,1024,2048,4096,
8192,16384,32768,65536,131072,262144,524288};
cin>>n;
if(n%2){
cout<<"-1";
return 0;
}
while(n){
int x=upper_bound(a,a+30,n)-a-1;
n-=a[x];
cout<<a[x]<<' ';
}
return 0;
}
这里空空如也



有帮助,赞一个