现附上代码。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
queue<int> q;
int main()
{
int t;
cin>>t;
while(t)
{
vector<int> m;
t--;
int n;
cin>>n;
int nn=n;
while(nn)
{
m.push_back(nn%2);
nn/=2;
}
int k=0;
for(int i=0;i<m.size()-1;i++)
{
if(m[i]==1)
{
q.push(n);
k++;
n-=pow(2,i);
}
}
for(int i=m.size()-1;i>=0;i--)
{
q.push(pow(2,i));
}
cout<<k+m.size()<<endl;
while(!q.empty())
{
cout<<q.front()<<" ";
q.pop();
}
cout<<endl;
}
}
这个题的灵感挺突然的,就是一看这个数我感觉就像次幂,然后看见位运算的标,我就去想如何去写,随后因为位运算二进制问题,所以一个数最多就可以用两次,因为只能是正整数所以一定是选择小于n的2的未知次方。
随后用动态数组去存储二进制,用了比较朴素的方法,+——+,然后可以利用队列,以及反向读取,让队列按顺序存入,方便并且很快!
输出的数量k是按照去掉开头的1的1数量加上次幂数,这些是阻碍变成次幂形式的拦路虎,全部删掉,随后从n开始减,得以AC。