ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2534|回复: 17

[分享] 凑数代码喜添丁

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-25 15:49 | 显示全部楼层 |阅读模式
     vba天下苦凑数久矣,直至香川群子修剪代码问世,世人惊叹"天花板的存在"。今有代码小兵,不揣冒昧称"我也会写",洒家不信,上机居然运行不爽。这是凑数代码的"月亮之上",还是华为套壳的魔改,是新手村的毕业宣言,还是换汤不换药的老戏新唱?

     以上戏言,博疫情之困的朋友一笑。代码是群友写的,群友是编程爱好者,除了VBA还在学习js for wps。婉转地说,这段代码无法替代裙子老师作品,最明显的是代码未考虑最接近目标数。

凑数.zip

12.53 KB, 下载次数: 109

1到100之间任意多个数相加等于100

评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-25 18:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Option Explicit
  2.    
  3. Sub main()
  4.     Dim t As Double, half As Integer, count As Long, stackSum As Integer, prevNums(), results(), num As Integer
  5.     t = Timer
  6.     ReDim results(1 To Rows.count, 1 To 1)
  7.    
  8.     Const sum = 100, startNum = 1
  9.     half = -Int(-sum / 2)
  10.     prevNums = Array(startNum, 0)
  11.    
  12.     With VBA.CreateObject("Scripting.Dictionary")
  13.         .Add startNum, ""
  14.         Do While True
  15.             num = prevNums(0)
  16.             prevNums(1) = stackSum
  17.             stackSum = stackSum + num
  18.             If stackSum = sum Then
  19.                 count = count + 1
  20.                 results(count, 1) = VBA.Join(.keys(), ",")
  21.                 If num = sum Then Exit Do
  22.                 .Remove num
  23.                 num = .keys()(.count - 1)
  24.                 .Remove num
  25.                 stackSum = prevNums(1) - num
  26.                 num = num + 1
  27.                 If num >= half And .count = 0 Then num = sum
  28.             ElseIf num < sum - stackSum Then
  29.                 num = num + 1
  30.             Else
  31.                 .Remove num
  32.                 stackSum = prevNums(1)
  33.                 num = sum - stackSum
  34.             End If
  35.             prevNums(0) = num
  36.             .Add num, ""
  37.         Loop
  38.     End With
  39.    
  40.    
  41.     Columns(1).ClearContents: Range("A1").Resize(count, 1).Value = results
  42.     Range("B1") = "结果集:" & count & "个、耗时:" & Timer - t & "秒"
  43. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-25 20:32 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-25 21:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
哈哈哈哈哈哈哈!

TA的精华主题

TA的得分主题

发表于 2022-12-26 08:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个凑数主要是用在日常哪些方面呢?

TA的精华主题

TA的得分主题

发表于 2022-12-26 10:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-26 10:21 来自手机 | 显示全部楼层
熊文来 发表于 2022-12-26 08:47
这个凑数主要是用在日常哪些方面呢?

这个算法是我写的,就是在1到100中枚举出全部能求和为100的不重复数字组合,这就是这个代码的功能。

其实真正妙的是我的凑数算法思路,也是想了好久的,根据这个算法思路,我写出了很多有意思的玩意,计算33选6的全部组合,1、2、3这3个元素的所有组合,以及实现了香川裙子大佬的递归凑数算法的功能。

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-26 22:36 | 显示全部楼层
厉害了,来粘点技术大师们的仙气
谢谢分享

TA的精华主题

TA的得分主题

发表于 2022-12-26 23:31 | 显示全部楼层
居然还有活跃的群,我的VBA群基本上一年多才有人冒个泡

TA的精华主题

TA的得分主题

发表于 2022-12-27 10:21 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 19:47 , Processed in 0.049224 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表