将一个数字拆分为几个自然数相加的形式,列举出所有可能。
比如:
输入:5
输出:
1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 2
1 + 1 + 3
1 + 2 + 2
1 + 4
2 + 3
5
#include<stdio.h>
#define N 1001
int rec[N];
//start:当前拆分出的数
//pos:保存到rec数组的位置记录
//left_num:上一轮拆分后,还剩下的数
void print(int n){
int i;
for( i=0;i<n-1;i++){
printf("%d+",rec[i]);
}
printf("%d\n",rec[n-1]);
return;
}
void dfs(int start,int pos,int left_num){
if(left_num==0){
print(pos);
return;
}
int i;
for(i=start;i<=left_num;i++){
rec[pos]=i;
dfs(i,pos+1,left_num-i);
}
return;
}
int main(void){
int n;
scanf("%d",&n);
dfs(1,0,n);
return 0;
}