题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。
输入格式
输入:待拆分的自然数n。
输出格式
输出:若干数的加法式子。
输入输出样例
输入
7
输出
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
#include <bits/stdc++.h>
using namespace std;
int n;
int a[25];
long long ans;
void dfs(int front,int step,int sum){
if(sum==0){
cout<<a[0];
for(int i=1;i<step;i++){
cout<<"+"<<a[i];
}
cout<<endl;
return ;
}
if(step==0){
for(int i = front; i <sum; i++){ //第一位不能枚举7,蛋疼测试点
a[step]=i;
dfs(i,step+1,sum-i);
}
}
else{
for(int i = front; i <=sum; i++){
a[step]=i;
dfs(i,step+1,sum-i);
}
}
}
int main(){
scanf("%d",&n);
dfs(1,0,n);
return 0;
}