参考程序(迭代法)代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num;
scanf("%d",&num);
if(num%2==1)//判断能否拆分
{
printf("%d\n",-1);
return 0;//直接退出程序
}
for(int i=25;i>=1;i--)//从大到小判断,最大不可能超过2^25
if((1<<i)<=num)//输出,1<<i代表1*2^i
{
printf("%d ",1<<i);//输出这个数
num-=(1<<i);//减去它
}
return 0;
}
参考程序(位运算)代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num;
scanf("%d",&num);
if(num%2==1)//判断能否拆分
{
printf("%d\n",-1);
return 0;//退出程序
}
/*将一个数转化为2进制,如6=1*2^2+1*2^1+0*2^0=110(2),也就是从最高位开始判断,
第i为如果有1,那么这个数就有一个2^i*/
for(int i=25;i>=1;i--)//
if((num>>i)&1)//看num左移i位后的最高位,也就是第i位是否有1,可以自己画图理解
printf("%d ",1<<i);//输出这个数
return 0;
}