解析:
根本就不用转2进制!!!求他的关于2的对数!!!
对于任意数,如果他是奇数,那么很容易判断,直接输出-1。
但如果是偶数,可以先求出该数关于2的对数,然后再将他的对数的幂输出,再将他减去他的对数的幂就可以了!!!
对第二段的代码:
int n,s;
int k;
int main()
{
cin>>n;
s=n;
int c;
if(n%2==0)
{
while(s>0)
{
k=floor(log(s)/log(2));//求小于n的最大2的幂指数
c=pow(2,k);
cout<<c<<' ';
s=s-c;
}
}
else cout<<-1<<endl;
return 0;
}
总代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iomanip>
using namespace std;
int n,s;
int k;
int main()
{
cin>>n;
s=n;
int c;
if(n%2==0)
{
while(s>0)
{
k=floor(log(s)/log(2));//求小于n的最大2的幂指数
c=pow(2,k);
cout<<c<<' ';
s=s-c;
}
}
else cout<<-1<<endl;
return 0;
}
主要是对对数的理解程度的问题
如果高中数学没学,我最好推荐你用下边的代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
char c[30];
int l;
void shito2(int n)
{
int s,y,i=0;
s=n/2;
y=n%2;c[i]=y;
while (s>0)
{
n=s ;
s=n/2;
y=n%2;
i++;
c[i]=y;
}
l=i;
}
int main()
{
int num,b;
//freopen("power.in","r",stdin);
//freopen("power.out","w",stdout);
cin>>num;
if(num%2==1)
{
cout<<-1;
return 0;
}
shito2(num);
for(int i=l;i>=0;i--)
{
if(c[i]==1)
{
b=pow(2,i);
printf("%d ",b);
}
}
fclose(stdin);
fclose(stdout);
}