题目描述
输入自然数n,然后将其分拆成由若干数相加的形式,参与加法运算的数可以重复
输入
待拆分的自然数n ( 1 < 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
Source Code
#include <stdio.h>
int a[101],len,n;
void dfs(int step)//step是分解出来的数中从第一个数到当前数的和
{
if(step == n)//如果加起来的和等于要拆分的数
{
if(len == 1) //表示只分解了一个数,即没有分解(len代表分解出来数的个数)
{
return ;
}
printf("%d",a[1]);//打印第一个数(前面没有加号)
for(int i = 2;i <= len;i ++)//从a[2]开始打印
{
printf("+%d",a[i]);//打印拆分的数
}
printf("
");//最后回车
return ;
}
int tmp = a[len];//tmp是上一个数 因为枚举的下一个数必须 >= 是上一个数 (保证拆分出来的算式不重复)
if(n >= (step + tmp))//假设现在拆分的数等于上一个数,和 <= n(要拆分的数) 那么这个数就是可以拆分的
{
len = len + 1;//下一个数
a[len] = n - step;//a[len] 代表最后一个数,值为 n(要拆分的数) -(前面数的和)
dfs(n);//已经拆分完了
len --;//打印完之后将当前值清除
}
for(int i = tmp;i < n - step;i ++)
{
len = len + 1;//下一个数
a[len] = i;//跟拆分的上一个数相等
dfs(step + i);//step是前面数的和 step + i代表前面数的和+最新的值 得到最新的和
len --;//打印完之后将当前值清除
}
}
int main()
{
scanf("%d",&n);
a[0] = 1;//从1开始分解,即分解的数 >= 1
dfs(0);//刚开始的和是0
return 0;
}