ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助:01-50以10个数字为组合

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-19 11:12 来自手机 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
数据量很大,有大神能教会我如何做出所有排列,或者用20个数字5个组合教会我做出所有排列的方法,可以支付报酬,谢谢了。

TA的精华主题

TA的得分主题

发表于 2018-7-19 12:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
最好能上传一个附件。来说明一下。

TA的精华主题

TA的得分主题

发表于 2018-7-19 13:08 | 显示全部楼层
关键看楼主这20个数字,5个组合具体是有什么要求
如果20个不重复数字,有序组合,最后包含重复数据的话,可以使用5层for循环处理

所以建议楼主上传附件,结合附件说明具体要求

TA的精华主题

TA的得分主题

发表于 2018-7-19 14:32 | 显示全部楼层
liulang0808 发表于 2018-7-19 13:08
关键看楼主这20个数字,5个组合具体是有什么要求
如果20个不重复数字,有序组合,最后包含重复数据的话, ...

50选10的组合结果数=10272278170

即102亿。

这样大数量的组合结果,一般说毫无意义。

楼主属于那种没有数字概念的人。

提出这样的问题基本毫无价值。

输出全部组合结果将占用几个T的硬盘。

TA的精华主题

TA的得分主题

发表于 2018-7-19 14:58 | 显示全部楼层
香川群子 发表于 2018-7-19 14:32
50选10的组合结果数=10272278170

即102亿。

楼主或许就是想了解思路,然后自己处理吧

TA的精华主题

TA的得分主题

发表于 2018-7-19 15:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
以前看书的时候模仿了一下,不知道是不是楼主想要的。
  1. Const A = 10     '原始数据长度
  2. Const L = 6     '定义排列的个数,
  3. Const H = 210     'C(4,2)=6!/(3!*(6-3))!=720
  4. Public Output(), nOut&, mOut&
  5. Public arrList(), nList&   ',组合数组
  6. Public arrComb(), iComb&   '原始数组
  7. '用于解决不重复字符(字母+数字)的组合
  8. '参考信息:
  9. 'http://zh.wikipedia.org/wiki/%E7%B5%84%E5%90%88%E6%95%B8%E5%AD%B8
  10. 'http://outofmemory.cn/code-snippet/4237/c-pailie-zuhe-suanfa
  11. '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12. Sub CombList()
  13. Dim t
  14. ReDim arrComb(1 To A)     '总元素数组
  15. ReDim arrList(1 To L)     '组合元素数组
  16. ReDim Output(1 To H, 1 To L)   '用于存储组合
  17. t = Timer
  18. For iComb = 1 To A
  19.    arrComb(iComb) = Sheet1.Cells(iComb, 1)   '原始数据读入数组
  20. Next
  21. nOut = 0    '初始化
  22. Combine_2 A, L
  23. Sheet2.[A1].Resize(nOut, L) = Output()
  24. Debug.Print Timer - t
  25. End Sub
  26. '主程序
  27. 'm为总元素数
  28. 'n为组合元素数
  29. Sub Combine_2(m, n)
  30. Dim i&  '变量
  31. If m < n Then Exit Sub  '总元素<组合元素
  32. If n = 0 Then
  33.    Exit Sub     '递归出口
  34. End If
  35. For i = m To n Step -1
  36.   arrList(n) = arrComb(i)   '总元素写入组合
  37.    If n > 1 Then            '判断是否是最后一个元素
  38.         Combine_2 i - 1, n - 1  '调用递归
  39.     Else
  40.      nOut = nOut + 1
  41.    '-----输出---------------------
  42.      For mOut = 1 To UBound(arrList)
  43.        Output(nOut, mOut) = arrList(mOut)
  44.       Next
  45.    End If
  46. Next i
  47. End Sub
复制代码

不重复组合.zip

22.06 KB, 下载次数: 7

组合

TA的精华主题

TA的得分主题

发表于 2018-7-19 17:07 | 显示全部楼层
zhenghui13 发表于 2018-7-19 15:23
以前看书的时候模仿了一下,不知道是不是楼主想要的。

经Stop检验,你代码中有2句是多余的。

If m < n Then Stop: Exit Sub '总元素<组合元素
If n = 0 Then Stop: Exit Sub '递归出口

代码运行时并没有产生Stop,说明这2句If判断不会被触发。

原因很简单,因为你的算法中已经排除了n=0的可能。
并且m当然不会<n

哈哈。

另外,发现你的输出结果,并非字典顺序,(即不是从小到大的自然排序)
而是反过来的。

这个其实可以在输出时纠正过来。
例如,当组合元素都是数字序号时,可以直接改成:
Output(nOut, L - mOut + 1) = A - arrList(mOut) + 1

但如果是文本或不是自然数序号,那就还需转换。

另外一个缺点是:
反复进入进出递归,效率肯定不如内循环。

总的来说,这个算法还是可以达到效果的,而且递归的过程也很简单。

TA的精华主题

TA的得分主题

发表于 2018-7-19 17:15 | 显示全部楼层
香川群子 发表于 2018-7-19 17:07
经Stop检验,你代码中有2句是多余的。

If m < n Then Stop: Exit Sub '总元素

谢谢指正,我是看书然后照抄的,实际上有一些还是不太理解。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-10 11:00 , Processed in 0.022935 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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