问题 b: 【递归入门】分解数
时间限制: 1 Sec 内存限制: 128 MB
提交: 26 解决: 18
[提交][状态][讨论版][命题人:外部导入]
题目描述
输入自然数n,然后将其分拆成由若干数相加的形式,参与加法运算的数可以重复
输入:待拆分的自然数n ( n < = 50 )
输出:若干数的加法式子
输入
输出
样例输入
7
样例输出
1+6
1+1+5
1+1+1+4
1+1+1+1+3
1+1+1+1+1+2
1+1+1+1+1+1+1
1+1+1+2+2
1+1+2+3
1+2+4
1+2+2+2
1+3+3
2+5
2+2+3
3+4
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n,a[51]={1};
void print(int k)
{
for(int i=1;i<=k;i++)
cout<<a[i]<<"+";
cout<<a[k+1]<<endl;
}
void dfs(int k)//对a[k]进行拆分
{
int l=a[k];
for(int i=a[k-1];i<=l/2;i++)//拆分出来的第一项大于等于前一项并且不超过a[k]/2,避免重复
{
a[k]=i;//将a[k]拆分成两个数a[k]和a[k+1]
a[k+1]=l-i;
print(k);
dfs(k+1);//对a[k+1]继续进行拆分
}
}
int main()
{
cin>>n;
a[1]=n;//把要拆分的数放入a[1]
dfs(1);
return 0;
}