CSP-J2 2020 题解(Updating)

T1 . 优秀的拆分

Written on 2020.11.11

题目传送门

Description

给定 \(n\) ,求 \(n\) 的二进制幂分解

Solution

不难想到,求 \(n\) 的二进制幂分解可以转化为表示二进制的问题。

而对于每一个 \(n\) ,当 \(n\) 没有一个合法的二进制幂分解时,当且仅当 \(n\) 为奇数。

故有此特判 :

if(n&1){
	printf("-1");
	return 0;
}

对于一般的 \(n\) 为偶数的情况,根据位值原理,(倒序)输出 \(bit[i]\) (当前位) \(\times 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;
}
posted @ 2020-11-11 17:20  _pwl  阅读(299)  评论(1编辑  收藏  举报
1 2 3
4