原题:https://www.luogu.com.cn/problem/P7071?contestId=37027
满分代码①:二进制&&位运算(&)
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n; 4 int main(){ 5 cin>>n; 6 if(n&1)cout<<-1; 7 else{ 8 for(int i=31;i>=1;i--){ 9 int sum=1<<i; //1<<31代表二进制中个位上的2向左移31-1=30位,代表2的30次方 10 if(n&sum)cout<<sum<<" "; 11 } 12 } 13 return 0; 14 }
其中,&不同于&&,它是求这个数二进制上是否有两个数同一位上全是1的情况,如:
14 二进制:1110
8 二进制:1000
4 二进制:0100
2 二进制:0010
所以:
14&8:1000——都是bool类型
14&4:0100
14&2:0010
14&1:0000
满分代码②:模拟
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,i=1; 4 int main(){ 5 cin>>n; 6 if(n%2==1)cout<<-1; 7 else{ 8 while(n){ 9 int sum=pow(2,i); 10 if(sum>n){ 11 cout<<sum/2<<" "; 12 n-=sum/2; 13 i=0; 14 } 15 i++; 16 } 17 } 18 return 0; 19 }