好吧,最近准备算法与程序设计竞赛(qwq我发现这个比赛的时候就离比赛时间没几天了好难),开始刷题了,刷到了这个自然数拆分的问题的问题,题目相对来说不难,但是对我来说还是有一些难度的,下面我就来说说这道题的解法和我的一些感悟吧。

先来看看题目。

我先来对题目的需求做一些阐述,题目要求要输入一个自然数,然后相当于找哪些自然数(在这篇文章之后我就叫它们是组成数吧)加起来能等于这个自然数,而组成这个数的自然数的个数不限,当然,很容易知道个数最多就是输入的自然数本身的值。要求是输出的组成数从小到大排列,中间有加号,字典序小的序列需要优先输出。(在这里我还特意查了查按字典序排列是什么意思,简单来说,就是比如有两段序列,那么先比较第一个字符,字符序列小的先输出,如果相同,则比较下一个字符,以此类推,所以说,到我们这个题目上来,1肯定比除了0的其它任何自然数都小,所以肯定首先输出的是全是1的序列,然后输出的序列以此类推,这个比较简单,就不多说了。)

下面回归题目,来找一找解决办法,emmm,自己在做的时候也是查了查解决办法,按照网上的解决办法来写的代码。

首先他要输入一个数字,那肯定要定义一个变量嘛来存储这个数字,在这里我定义为num。然后我们要对num不断拆分,那么经过一次一次的拆分,每次拆分后都会剩下一个值用于之后的在此拆分直至拆分结束,在这里我定义了cur变量来存储当前的拆分剩余值,当然,直接用num也可以,不过我为了更好地区分就没有用num。在输出时,要输出一个序列,所以需要一个数组来存储每次拆分的数字,这个数组我命名为a。(我刷的这道题的话,输入的数字是1到9,所以只定义了10个长度。++)

#include<iostream>
using namespace std;
int cur;//cur存储当前所剩值
int num;//num是输入数
int a[10];//存储拆分的数字
int new_num;//记录最新拆分的数字的下标

定义完相关的变量后我们来说一说整体的一个设计,这道题比较简单啦,所以就是写一个自然数拆分函数,之后在main函数里去调用它。这个题目的核心部分就是拆分函数,所以我们接下来还是主要说一说拆分函数的实现思路吧。

拆分函数的功能就是把自然数拆分,那我们先来考虑一些特殊情况吧,就是说比如他是可以直接输出的情况比如输入0,那他不能再拆分为更小的自然数了,所以在这种情况下我们直接输出就可以,这里可以用一个if结构来实现,还有一种特殊情况就是已经把所输入的数字拆分完了即当前的cur等于0,这时就需要输出了,利用数组将存储的组成数进行输出,需要注意的是,这个时候如果是同时输出数字和加号的话,先不要输出最后一个组成数,如果输出的话,会导致最后结果多一个加号,正确的方法是:利用for循环将组成数输出到倒数第二个,再在for循环外单独起一行进行最后一个组成数的输出,并且记得在这儿加上换行符,不然多个序列之间没法换行。

考虑完了特殊情况,最主要的东西来了,那就是怎么拆分自然数呢?

这里是用到了递归思想的,我将这个函数命名为了void devide(int last),其中last是上次拆分的数字,也就是说,比如上个序列是11111,那这次这个序列就是1112,1就是上次拆分的数字,从上次拆分的数字开始进行拆分,才能拆到2。

除了递归思想,还要用到for循环进行辅助,也就是利用for循环进行枚举,将上次拆分的数字赋值给for循环中的i,在每次循环中,都将i存入a数组中以便之后的输出,在存完之后,将剩余值进行更新,也就是用cur减去拆分值i,之后调用函数本身进行递归,递归完之后,记得要将数字下标和剩余值更新回原状态以便下一次的拆分使用。

内容大概就是这么多啦,下面看看成果吧!

自然数拆分问题的解法与感悟(C++)相关推荐

  1. [JOYOI] 自然数拆分Lunatic版

    题目背景 话说小小鱼看了P1171(自然数拆分)之后感觉异常不爽,于是异常邪恶地将题目加强.题目描述 输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复.输入格式 输入只有一个整 ...

  2. 再练动态规划——(2)自然数拆分Lunatic版

    自然数拆分Lunatic版 题目描述 输入自然数 nnn ,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复. 输入格式 输入只有一个整数 nnn ,表示待拆分的自然数 nnn . 0< ...

  3. tyvj1172 自然数拆分Lunatic版

    背景 话说小小鱼看了P1171(自然数拆分)之后感觉异常不爽,于是异常邪恶地将题目加强. 描述 输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复. 输入格式 输入只有一个整数n ...

  4. 【背包dp】自然数拆分Lunatic版

    Tyvj 1172 自然数拆分Lunatic版 题意:给定一个自然数n(1<= n <= 4000), 要求把自然数n拆分成n个正整数相加的情况(正整数可以重复出现, 但顺序不同仍视为同一 ...

  5. CH5202 自然数拆分Lunatic版【完全背包】

    5202 自然数拆分Lunatic版 0x50「动态规划」例题 描述 给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复.求拆分的方案数 mod 2147483648的结 ...

  6. TYVJ1172 自然数拆分Lunatic版 - 背包DP[完全背包]

    TYVJ1172 自然数拆分Lunatic版 传送门 思路: 类比TYVJ1096 数字组合 , 本题的数字可以重复使用,所以是一个完全背包模型.\(f[i,j]\)表示当前选到第\(i\)类数字凑成 ...

  7. 自然数拆分(回溯法)

    一个整数N(N > 1)可以拆分成若干个大于等于1的自然数之和,请你输出所有不重复的拆分方式. 若满足集合A=B,则称这两种拆分方式是重复的. 例如 6 = 3 + 2 和 6 = 2 + 3, ...

  8. P2404 自然数拆分问题

    题目描述 任何一个大于 1 的自然数 n,总可以拆分成若干个小于 n 的自然数之和.现在给你一个自然数 n,要求你求出 n 的拆分成一些数字的和.每个拆分后的序列中的数字从小到大排序.然后你需要输出这 ...

  9. 洛谷 p2404 自然数拆分问题

    题目链接 题目描述 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和.现在给你一个自然数n,要求你求出n的拆分成一些数字的和.每个拆分后的序列中的数字从小到大排序.然后你需要输出这些序列 ...

最新文章

  1. iospython开发工具_使用Python开发iOS程序
  2. 数据结构——顺序存储二叉树
  3. So Easy! 让开发人员更轻松的工具和资源
  4. jdbc建立数据库连接的helloword
  5. finalize方法_final,finally,finalize三者的含义和区别
  6. 目标检测的二十年发展史—从传统方法到深度学
  7. 鼠标点击改变单元格颜色或点击改变行颜色
  8. linux和windows php pdf转图片,扩展安装imagick和ImageMagick
  9. 爱奇艺推出“帧绮映画MAX”标准打造高品质视听 多款电视机型获认证
  10. Kruskal算法 数据结构 浙江大学 陈越、何钦铭
  11. 21计算机考研国家线,来了!21考研国家线公布!附详细解读!
  12. R语言-回归系数的极大似然估计
  13. 可并堆(左高树、左偏树)
  14. 大学计算思维c语言答案,【程序设计论文】计算思维为下的C语言程序设计教学(共2755字)...
  15. 猎聘Q1营收毛利齐增,在线招聘的“春天”要来了么?
  16. java8 stream map flatMap
  17. windows找不到文件 pythonw
  18. Everything官网下载
  19. 音乐网站毕业设计html,静态音乐网站设计(毕业论文).doc
  20. 阿里云——轻量应用服务器

热门文章

  1. 求矩形槽内电位分布matlab,MATLAB求解接地金属槽内电位分布
  2. 达观财务报表解析与核查系统助力金融企业财报管理变革
  3. VS2019怎么没有C++的窗体应用模板_三维类石墨烯多孔碳纳米片的非生物质前体构筑及电化学储能应用...
  4. abs的应用(c++)
  5. 【工作笔记】RAM和ROM种类与区别
  6. JAVA计算机毕业设计房屋中介管理Mybatis+系统+数据库+调试部署
  7. 银联文件传输接口,对账文件字段含义
  8. PFA试剂瓶的特点以及优势
  9. 浅析uc/os_II设备驱动的设计与实现
  10. MySQL学习-数据库、表、字段的定义