• 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("
    ");//最后回车 
            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;
    }
    
  • 相关阅读:
    6.2.2 RPM包管理-rpm命令管理-安装升级与卸载
    6.2 RPM包管理-rpm命令管理-包命名规则和依赖性
    6.1软件包管理简介
    sql server 2012还原数据库时报错(错误码:3154)
    SQL Server2012安装教程
    常用端口及对应服务
    PING命令排查网络故障思路
    必须掌握的八个DOS命令(转)
    svchost占用内存过高电脑很卡如何解决
    optional的用法
  • 原文地址:https://www.cnblogs.com/LJA001162/p/11339807.html
Copyright © 2020-2023  润新知