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]) (当前位) ( 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;
}
原文地址:https://www.cnblogs.com/-pwl/p/13959643.html