看到贴吧有人在人工玩数字拆分,我试试用计算机玩玩数字拆分。玩数字拆分第一个想到的就是用递归方法,具体代码如图1所示,从图1可以看出,代码非常简单。

图1 拆分数字递归代码

试着对数字6进行拆分,运行递归拆分数字的程序,得结果如图2所示。

图2 数字6拆分的递归输出

显然,图2中输出数据是不完整的,我们试着把数据重构出来,如图3所示。

图3-1 数字6拆分完整数据

图3-2 数字6拆分完整数据

图3中第一行数据是1 5,第二行数据是1 1

4,第二行中第1个1是从上一行中继承下来的,第二行中1和4是从上一行的数字5拆分而来,这就是数据重构的规律,这样我们就在程序中增加一个二维数据,用以记录拆分数据,运行修改后的程序得结果如图4所示。

图4 数字6的拆分

从图4中可以看出,拆分数据是完整的,拆分也没有遗漏,但有一个问题,拆分数据有大量重复,比如1 1 2 2和1

2 1 2就是重复拆分数据,那接下来要做的改进是去除重复数据,运行修改后的程序,得结果如图5所示。

图5 数字6拆分的种类

从图5中可以看出,数字6用递归方法拆分出19种,当拆分数字11时,共拆分出557种,如图6所示。

图6 数字11的拆分种类数

这样问题又来了,我们是用整数类型int定义的二维数组,最大到(貌似)1000*1000,在数字拆分这个问题,这样的数组大小是远不够的,我们改用char类型定义二维数组,此时最大到(貌似)2000*1000,改用char类型数组后,大概最大可以拆分到数字21,我们实际试算了数字19的拆分,如图7所示。

图7 数字19的拆分

从图7中可以看出,用递归方法拆分数字,数据量巨大,时间复杂度也大,有没有更好的办法,想出了一个迭代公式,f(n)=1*f(n-1)+2*f(n-2)+3*f(n-3)+...+(n-1)*f(1)=Σ(n-i)*f(i),i=1...n-1,这个公式的意义如图8所示。

图8 数字拆分迭代计算公式

在拆分迭代计算公式中初始值为,1=1,2=2,2=1+1,用代码实现数字拆分迭代公式,试算数字5拆分,其结果如图9所示。

图9-1 迭代算法v0.1拆分数字5

图9-2 迭代算法v0.1拆分数字5

从图9中可以看出,用迭代算法拆分数字5结果是正确的,再用迭代算法试算数字6的拆分,如图10所示。

图10 迭代算法v0.1拆分数字6

从图10可以看出,迭代算法计算数字6的拆分有遗漏,少了一个6=3+3,那我们把迭代算法改进一下,f(n)=Σ(n-i)*f(i)+ceil(n/2)*floor(n/2),这样改进后,数字6拆分是对了,如图11所示。

图11 迭代算法v0.2拆分数字6

然而,用改进后迭代算法计算数字11的拆分,还是错了,如图12所示。

图12 迭代算法v0.2计算数字11拆分

从图12可以看出,用改进迭代公式计算拆分有遗漏,以后还作了一点小改进,但用代码实现迭代公式后,运行程序,发现拆分仍有遗漏,此时突然明白,问题不在那上面,而是漏了一个(n-1、1)的拆分,这样将拆分公式改进为f(n)=∑(n-i)*f(i)+(n-1)*1,式中n>=2,i=1...n-1,f(1)=1,

1*(n-1)=1+(n-1)=n,从图12中还可以看出一个问题,那就是拆分出来的种类数很大,而其中绝大部分是重复的,为此,每进行一个数字的拆分都作去重计算,即

迭代拆分算法:

1.迭代计算拆分

2.去重复计算

3.没达到n回到第1步,否则输出拆分数据

用改进后迭代算法,计算数字30的拆分,如图13所示。

图13 迭代算法v1.0计算数字30的拆分

从图13可以看出,用迭代算法计算数字拆分,时间复杂度和空间复杂度都大为降底,但即使这样,计算一个大一点数字的拆分仍是不可想象的,而递归算法计算数字拆分,如果不考虑去重复问题则受制编译器的递归重数。

一个看似小学生都会的数字拆分,在程序实现上竞有那么多问题,我不知道是否还有更好、更简单算法,也不知道迭代计算数字拆分是我原创,还是早就有了,只是我不知道而己。

c语言数字拆分,在手机上玩C语言—数字拆分相关推荐

  1. 怎么在php中加拼图游戏,js+html5实现可在手机上玩的拼图游戏

    本文实例讲述了js+html5实现可在手机上玩的拼图游戏.分享给大家供大家参考.具体如下: 手机版的拼图.pc上用Chrome 或者 Firefox var R=(function(){ /*右边菜单 ...

  2. 在手机上玩魔兽争霸2

    至从买了Moto的E608i手机,它就不断的给我惊喜.在手机上玩魔兽,请按照如下步骤操作: 下载并安装stratagus-2.1.mpkg 从np0的页面下载StratagusQVGA.rar ,这个 ...

  3. 终于在手机上玩到了原版大富翁(monoply)

    在和大学舍友研究有什么集体活动时,我突然想到了曾在自家wii上玩过的monoply,在手机上能不能玩捏?于是我开始寻找资源,结果找来找去,不仅找不到monoply,就连找到的台产的大富翁4Fun都无法 ...

  4. 在手机上玩python编程-Pydroid3

    手机屏幕太少,写代码不方便,建议用电脑学习python 有时候,就是不想正襟危坐的坐在电脑前面,想要在手机上轻量级的写点代码. 安卓软件推荐  Pydroid.3 Pydroid 3免费高级版app是 ...

  5. 手机可以玩python吗_在手机上玩python编程-Pydroid3

    手机屏幕太少,写代码不方便,建议用电脑学习python 有时候,就是不想正襟危坐的坐在电脑前面,想要在手机上轻量级的写点代码. 安卓软件推荐 Pydroid.3 Pydroid 3免费高级版app是一 ...

  6. python数字滚动效果_玩转PPT数字滚动,让数据动起来

    大数据时代,各类数字充斥着我们生活的方方面面,相较传统印象中平面冷硬的形象,当下数字的展现已向可视化.多样化转变与流行.如何玩转数字,让数字"活"起来.动起来,是不少职场达人展示数 ...

  7. html游戏能在手机上玩吗,怎么在电脑上玩手机游戏? 每日一答

    怎么在电脑上玩手机游戏? 手机游戏现在很火爆,大家随时随地都可以拿出手机玩上一会,不过很多时候需要长时间挂机的话还是想要用电脑来玩游戏.游戏耗电量比较大,如果不停的充电放电,手机电池的寿命会大幅度削减 ...

  8. 手机玩exe游戏的模拟器_如何在手机上玩全面战争模拟器等电脑付费游戏?

    在电脑上,我们在steam上清楚的看到,全面战争模拟器和绝地求生这种游戏,通通要RMB. 于是玩这些高价游戏,便成了我们可望不可及的一件事.那有没有办法,能让我们免费体验一下这些神器的游戏呢? 答案是 ...

  9. c语言文件怎么在手机上打开,各位前辈这两个程序怎么在手机上运行

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /*made by ebhrz*/ #include #include #include #include #include #include #incl ...

最新文章

  1. 使用指定glibc编译程序
  2. 图形基础 GPU架构(5)并行计算
  3. 用Python处理图片九宫格
  4. deMeer5_Attacker
  5. STM32与SHT1X温湿度传感器通讯
  6. Linux下进行源码安装时如何避免找不到那些使用--prefix指定目录安装的依赖
  7. 深度学习2.0-普通BP神经网络
  8. codeforces 665A Buses Between Cities
  9. CGI和BOA使用期间遇到的问题汇总(转)
  10. 愉快地在64位系统下运行汇编
  11. 汽车金融-融资租赁模式信息化系统建设方案
  12. 平面广告创意设计4大原则
  13. 淘宝定价的方式有什么,如何根据活动来定价
  14. 11.4王者荣耀服务器维护中,4月11日全服不停机更新公告
  15. 西门子PLC学习笔记十-(计数器)
  16. CDA数据分析师认证与Pearson VUE达成深度合作
  17. 一位资深开发的个人经历 【转自百度贴吧 java吧 原标题 4年java 3年产品 现在又开始做android了】...
  18. river歌曲表达的意思_Agnes Obel的riverside歌词表达什么意思?(不是翻译)
  19. Maven升级3.8.1后maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories
  20. 计算机作文我的职业理想300字,我理想的职业小学生作文范文(精选3篇)

热门文章

  1. 李博轩担任摄影作品有哪些?
  2. 细水长流+润物无声——2021企业营销数字化转型研究报告
  3. 致老友-有时候我词不达意 但我真的很开心生活有你
  4. 2023 OneTool多平台助手程序源码 开心版
  5. 使用python requests 爬取妹子图网站图片
  6. 一个爬取图片的app
  7. python爬取pexels网站图片
  8. 分数阶傅立叶变换中午matlab,怎么做短时分数阶傅里叶变换
  9. 一张图看懂阿里云网络产品[七]共享流量包
  10. 名帖222 赵孟頫 行书《行书三段卷》