数的拆分(数的划分)
要求找出具有下列性质的数的个数(包含输入的自然数n):
先输入一个自然数n(n<=5*10^6),然后对此自然数按照如下方法进行处理:
①.不作任何处理;
②.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
③.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
样例: 输入:6
满足条件的数为: 6
1 6
2 6
1 2 6
3 6
1 3 6
若输出的是划分,即递归路径的话,程序如下:
#include<cstdio> #include<cstdlib> using namespace std; int n,a[5000100]; void eva(int p,int cur) { for(int i=cur-1;i>0;i--)printf("%d ",a[i]); printf("%d\n",a[0]); for(int i=1;i<=(p>>1);i++){ a[cur]=i; eva(i,cur+1); } } int main() { scanf("%d",&n); a[0]=n; eva(n,1); return 0; }