题解 P7071 【优秀的拆分】
作为CSP的第一题,他的难度系数还是很乐观的
这一题一看就是一个 十进制 数转 二进制数 的模板了
刷水题多的人一看就知道,只是特判一下当这个数为奇数时输出-1就可以了
(2^x+2^y+2^0其中2^x和2^y一定为偶数所以奇偶性取决于2^0是否存在,所以看奇偶就可以判断了)
这题有很多种做法(DFS貌似也能过),我来介绍一下我的方法:
众所周知求十进制数转二进制数可以用 辗转相除法 来做的,于是我准备存下这个二进制数来最后从后向前输出值来做
代码如下:
#include<bits/stdc++.h> //这次考试好像能用万能头
int n,gs;
bool a[35];//用来存二进制数
void xz(){
while(n!=0){//辗转相除法
if(n%2==1)a[gs]=1;
n/=2;
++gs;
}
}
int main(){
scanf("%d",&n);
if(n%2==1){//如果它为奇数,则一定含2^0
printf("-1");
return 0;
}
xz();//转进制存到a数组
while(gs--){
if(a[gs])printf("%lld ",1<<gs);//倒序判断是否为一,输出2^gs
}
}