Problem Description
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
Input
输入有多组数据,对于每组数据就一个数n。
Output
对于每组输入输出n的拆分方法。
Sample Input
4
Sample Output
1+1+1+1
1+1+2
1+3
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
Input
输入有多组数据,对于每组数据就一个数n。
Output
对于每组输入输出n的拆分方法。
Sample Input
4
Sample Output
1+1+1+1
1+1+2
1+3
2+2
#include<stdio.h>
#include<string.h>
int d[10010];
void print(int x)
{
int i;
for(i=0;i<x;i++)
if(i!=x-1)
printf("%d+",d[i]);
else printf("%d\n",d[i]);
}
void dfs(int st,int cnt)
{
if(st==0&&cnt>1)//cnt>1保证不会输出单个4
{
print(cnt);//打印序列
return ;
}
if(st<0) return;//剪枝
int i;
for(i=1;i<=st;i++)
{
if(i>=d[cnt-1])//i>=d[cnt-1]的话,保证不会出现1+1+2,之后又出现2+1+1,1+2+1
{
d[cnt]=i;//把数一个一个加入序列中
dfs(st-i,cnt+1);
}
}
}
int main()
{
//freopen("b.txt","r",stdin);
int n;
while(scanf("%d",&n)==1)
{
memset(d,0,sizeof(d));
dfs(n,0);
}
return 0;
}