c++ 分解数2

题目描述

输入自然数n,然后将其分拆成由若干数相加的形式,参与加法运算的数可以重复
例如将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=1+6,7=2+5,7=1+1+5,…。编程求出正整数N的所有整数分解式子。

输入

输入
待拆分的自然数n ( 1 < n < = 50 )

输出

若干数的加法式子(注意观察输出的顺序)。

样例输入

7

样例输出

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
7=7

Source Code

#include <stdio.h>
#define MAX 10 //最多能拆分10个数
int a[MAX];
int n,top=-1,sum=0;
void dfs(int i)
{
    if(sum==n)//如果分解的数加起来等于n (n:要分解的数)
    {
        printf("%d=",n);
        for(int j=0;j<top;j++)//输出这些分解的数
            printf("%d+",a[j]);
        printf("%d
",a[top]);//单独输出因为最后一个数后面没有加号,并且需要回车
        return;
    }
    if(sum>n)//如果分解出来的数大于n
        return;//返回
    for(int k=i;k<=n;k++)
    {
        top=top+1;//移动当前要分解数的位置(栈里面的位置)
        a[top]=k;//给当前位置赋值
        sum=sum+k;//sum就是分解出来数加起来的和,把现在这个拆出来的数累加进去
        dfs(k);//当前位置选k
        sum=sum-k;//当前位置判断结束后,再判断上一个数,所以将当前位置的值从sum中移除
        top--;//当前位置的数被循环赋值并判断后再选择上一个数
    }
}
int main()
{
    scanf("%d",&n);//n是要分解的数
    dfs(1);//当前位置选1
    return 0;
}

原文地址:https://www.cnblogs.com/LJA001162/p/11399313.html