题目描述

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:参考输出样例

输入

输入有多组数据,每组数据一行,每行给出一个正整数n(2<=n<=20)。

输出

对于每组数据输出若干行,参考样例。
相邻两组样例之间输出一个空行。

样例输入 Copy

2
7

样例输出 Copy

2=1+1

7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4

#include<iostream>
#include<cstdio>
using namespace std;
int n;
int a[1000];
void dfs(int x,int u)//x表示第几个位置,u表示剩下的数(就是n减去前一个位置的数剩下的数)
{
    if(u==0&&x>2)//如果剩下的数为0了而且最起码有2个位置
    {
        printf("%d=",n);//输出格式
        for(int i=1;i<x-1;i++)
        {
            printf("%d+",a[i]);
        }
        printf("%d\n",a[x-1]);//单独输出最后一个数,因为最后一个数的后面没有加号
        return ;
    }
    for(int i=1;i<=u;i++)
    {
        if(i>=a[x-1])//剩下的数要大于等于前面位置上的那个数,这是为了顺序
        {
            a[x]=i;//数组中x的位置为i
            u=u-i;//剩余的数减去i
            dfs(x+1,u);
            //回溯
            a[x]=0;
            u=u+i;
         } 
    }
}
int main()
{
    while(cin>>n)//输入n
    {
        a[0]=1;//算式中第一个数是1
        dfs(1,n);
        printf("\n");
    }
    return 0;
}