(一)
可以將 \(x\) 轉為二進位制。
考慮一個數的二進位制 \((1\dots10\dots0)\)。
其中,第一個省略號中有什麼不確定,第二個省略號裡都是 \(0\)。
易得,每個數都可以看成這種形式。
那麼可以每次去掉最後一位的 \(1\),易證減去的數是原數的因數。
最後會得到形如 \((10\dots0)\),省略號中全是 \(0\)。
此時從最大一位往後依次把每一位去掉即可。
(二)
AC 程式碼。
簡潔明瞭。
#include<bits/stdc++.h>
using namespace std;
int t,cnt,x,a[1010];
int lowbit(int x){
return x&-x;
}
int main(){
cin>>t;
while(t--){
cin>>x,cnt=0;
for(;x&(x-1);x-=lowbit(x))a[++cnt]=x;
for(;x;x>>=1)a[++cnt]=x;
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}