优秀的拆分(power)

方法一:模拟

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     cin>>n;
 7     if(n%2==1)
 8         cout<<-1;
 9     else{
10         while(n>0){
11             int p=1;
12             while(n>=p)
13                 p*=2;
14             cout<<p/2<<" ";
15             n-=p/2;
16         }
17     }
18     return 0;
19  } 

方法二:位运算(按位&)

举例说明1:14  的可以最优拆分为 8 4 2

14的二进制1110

8  的二进制1000  与14按位&结果为1000  (8 非0)

4  的二进制0100  与14按位&结果为0100  (4 非0)

2  的二进制0010  与14按位&结果为0010  (2 非0)

举例说明2:10  的可以最优拆分为 8 2

10的二进制1010

8  的二进制1000  与10按位&结果为1000   (8 非0)

4  的二进制0100  与10按位&结果为0000   (0 )

2  的二进制0010  与10按位&结果为0010   (2 非0)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int main()
 5 {
 6     cin>>n;
 7     if(n&1)
 8         cout<<-1;
 9     else{
10         for(int i=31; i>=1; i--){//n值范围[1,10^7]所以i枚举范围[31,1]
11             int t=(1<<i);// 或者 t=pow(2, i);
12             if(t&n)
13             cout<<t<<" ";
14         }
15     }
16     return 0;
17 }

 

posted @ 2020-11-07 16:25  TFLSNOI  阅读(2631)  评论(0编辑  收藏  举报