倍增以及二进制的思想
比如我们要算的是10 如果要组成的一个数能由一部分加上另一部分组成就ok了 6~10可以由1~5加5组成 所以要选5 接下来就把5除2然后再用小的一部分组成大的一部分 一直除2到不能再除
因为要从小到大输出 但第一个确定的一定是最大的 所以可以用栈存储
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
using namespace std;
#define in = read();
typedef long long ll;
typedef unsigned int ui;
const ll size = 100 + 1;
int n , top;
int stack[size];
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
int main(){
n in;
while(n){
stack[++ top] = ((n + 1)>>1);
n >>= 1;
}
printf("%d\n" , top);
while(top){
printf("%d " , stack[top]);
top --;
}
}
//COYG