题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。拆分成的数字相同但顺序不同被看做是相同的方案,如果1+3与3+1被看做是同一种方案。
输入
输入待拆分的自然数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,total=0;
int a[10001]={1};
int print(int t)
{
total++;
// cout<<n<<"=";
for(int i=1;i<=t;i++)
{
if(i==t)
{
cout<<a[i];
cout<<endl;
}
else cout<<a[i]<<"+";
}
}
int search(int s,int t)
{
int i;
for(i=a[t-1];i<=s;i++)
if(i<n) //当前数i要大于等于前1位数,且不过n
{
a[t]=i; //保存当前拆分的数i
s-=i; //s减去i,s的值继续拆分
if(s==0) print(t); //s==0 拆分结束输出结果
else search(s,t+1); //s>0,继续递归
s+=i; //回溯:加上拆分的数,以便产分所有可能的拆分
}
return 0;
}
int main()
{
cin>>n;
search(n,1); //将要拆分的数n传递给s
// cout<<total<<endl; //这是总方案数
return 0;
}