zoukankan      html  css  js  c++  java
  • 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;
    }
    
    

  • 相关阅读:
    Linux下截图工具
    Vue学习——router路由的实现原理
    Vue学习——vue的双向数据绑定原理
    JavaScript学习——面向对象(一)——创建对象(工厂模式和构造器模式)
    子组件给父组件的传值
    Vue组件
    JavaScript学习——事件对象Event
    JavaScript学习——事件处理程序
    JavaScript技巧——轮播图
    javascript——let关键字
  • 原文地址:https://www.cnblogs.com/LJA001162/p/11399313.html
Copyright © 2011-2022 走看看