题解
2023-06-04 14:45:43
发布于:陕西
一、对于一个数的合法的优秀的拆分,会发现可以从大到小进行枚举即可,这就变成了位运算。
#include<cstdio>
using namespace std;
int main(){
int n;
scanf("%d",&n);
if(n%2==1||n<2){
printf("-1");
}else{
int i=2;
while(i*2<=n){
i<<=1;
}
while(n!=0){
if(i<=n){
n=n-i;
printf("%d ",i);
}
i>>=1;
}
}
return 0;
}
二、注意特判是奇数的情况,直接模拟即可。
题目大意是给定一个正整数n,让你用二进制表示(但不包括2^0),又因为我们可以证明二进制可以表示任何整数,所以在题目中,只要是偶数,就是“优秀的拆分”,因此,如果n为奇数,就可以直接排除,即输出-1。
接着我们来看N为偶数的情况,由于二进制有其专有的特性,就是说如果能取大的,就尽量取大的,因此我们只需要从最大的二的正整数幂找起,然后一次次除以二,一直除到二时,就可以结束,代码如下:
#include<cstdio>
using namespace std;
int main(){
int n;
scanf("%d",&n);
if(n%2==1){
printf("-1"); //若为奇数,一定不是优秀的拆分
}else{
int m=2;
while(m<n){
m*=2;
}
if(m>n){ //m可能等于n,因此需要判断
m/=2;
}
while(n>0){
printf("%d ",m);
n-=m;
while(m>n){
m/=2; //寻找小于n的最大的m
}
}
}
return 0;
这里空空如也
有帮助,赞一个