题解 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 
    }
}