zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    字符串匹配算法之SimHash算法
    Shell 判断
    剑指offer 面试题6:重建二叉树
    字符串匹配算法之BF(Brute-Force)算法
    Python变量/运算符/函数/模块/string
    trie树
    AWK文本处理工具(Linux)
    Linux 进程间通信(一)
    Nginx学习笔记(八) Nginx进程启动分析
    进程状态转换、CPU调度算法
  • 原文地址:https://www.cnblogs.com/LJA001162/p/11339807.html
Copyright © 2011-2022 走看看