T1 . 优秀的拆分
Written on 2020.11.11
Description
给定 (n) ,求 (n) 的二进制幂分解
Solution
不难想到,求 (n) 的二进制幂分解可以转化为表示二进制的问题。
而对于每一个 (n) ,当 (n) 没有一个合法的二进制幂分解时,当且仅当 (n) 为奇数。
故有此特判 :
if(n&1){
printf("-1");
return 0;
}
对于一般的 (n) 为偶数的情况,根据位值原理,(倒序)输出 (bit[i]) (当前位) ( imes 2^{i-1})
Code
#include<iostream>
#include<cstdio>
using namespace std;
inline void read(int &x){
int f=1;
char ch=getchar();
x=0;
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch&15);
ch=getchar();
}
x*=f;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
int n;
int bit[30];
int main(){
int len=0;
read(n);
if(n&1){
printf("-1");
return 0;
}
while(n){
bit[++len]=n%2;
n/=2;
}
for(int i=len;i>=1;i--){
if(bit[i]){
write(bit[i]*(1<<(i-1)));
putchar(' ');
}
}
return 0;
}