c++ 分解数

题目描述

输入自然数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("\n");//最后回车 
        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;
}

原文链接: https://www.cnblogs.com/LJA001162/p/11339807.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++ 分解数

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/300767

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 下午9:43
下一篇 2023年2月15日 下午9:43

相关推荐