方法一:模拟
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 }