ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 快速生成m位 l - n 区间内(n +1)进制数全部组合的自定义函数

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-15 20:16 | 显示全部楼层
本帖已被收录到知识树中,索引项:自定义函数开发
呵呵,智力题没有人关注?!

点评

可能您的帖子多少有点曲高和寡吧……我是瞎捣乱养成坏习惯了……惭愧惭愧……  发表于 2014-8-15 21:41

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-15 20:21 | 显示全部楼层
aoe1981 发表于 2014-8-15 18:33
  此题我没有想到一揽子解决的方法,也就是说可以拓展到m个瓶子的情况。但对于三个瓶子的情况,我凑到了 ...

现在1、2、3的解是正确的。

但如何总结规律,扩展到m呢? (请结合本帖主题进行思考。)

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-15 20:38 | 显示全部楼层
本帖最后由 香川群子 于 2014-8-15 20:39 编辑
aoe1981 发表于 2014-8-15 18:33
  此题我没有想到一揽子解决的方法,也就是说可以拓展到m个瓶子的情况。但对于三个瓶子的情况,我凑到了 ...

你似乎是直接跳到了第2步了……


本题最简单的解法是:
#1号瓶取100粒、#2号瓶取10粒、#3号瓶取1粒。


那么它们的6种排列状态对应结果是:
Pic.jpg



#1号瓶取100粒、#2号瓶取10粒、#3号瓶取1粒
这样子,称重结果,直接就是瓶的排列顺序。
如 231g 就是说: #1号瓶为2g、#2号瓶为3g、#3号瓶为1g 这样的顺序。


如 312g 就是说: #1号瓶为3g、#2号瓶为1g、#3号瓶为2g 这样的顺序。




呵呵,很容易吧。



点评

好!!!这个思路容易拓展了!!!  发表于 2014-8-15 20:44

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-8-15 20:40 | 显示全部楼层
香川群子 发表于 2014-8-15 20:21
现在1、2、3的解是正确的。

但如何总结规律,扩展到m呢? (请结合本帖主题进行思考。)

  现在?不应该是这样的吧?
   1.jpg
  如上图,一次性称得重量为13克或11克的有两种情况,不好确定吧……
  这个题,取的颗数:x、y、z应该为不同的值,这样才能对3个瓶有所识别,只有一次性称重结果唯一时才可以确定吧……
  当然,我现在没多少思路了……
  您的代码还没有研究了……

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 20:37 | 显示全部楼层
药丸问题其实很有意思的。

也可以转换为这样的问题:
【求自然数中的一个含有n个数的序列,要求这n个数的排列组合和1-n的数组乘积结果,没有重复。求总和最小的序列。】

例如:
n = 1 时,显然结果就是 1

n = 2 时,总和最小序列是 1、2
一共有Fact(2)=2种排列组合,对应乘积和为:=SUMPRODUCT({1,2},{1,2})=5、=SUMPRODUCT({1,2},{2,1})=4


n = 3 时,总和最小序列是 1、2、4
一共有Fact(3)=6种排列组合,对应乘积和为:
=SUMPRODUCT({1,2,3},{1,2,4})=17、=SUMPRODUCT({1,3,2},{1,2,4})=15、=SUMPRODUCT({2,1,3},{1,2,4})=16
=SUMPRODUCT({2,3,1},{1,2,4})=12、=SUMPRODUCT({3,1,2},{1,2,4})=13、=SUMPRODUCT({3,2,1},{1,2,4})=11



n = 4 时,总和最小序列是 1、2、5、15
一共有Fact(4)=24种排列组合,对应乘积和为:
1,2,3,4 → 80 ; 1,2,4,3 → 70 ; 1,3,2,4 → 77 ; 1,3,4,2 → 57 ; 1,4,2,3 → 64 ; 1,4,3,2 → 54 ;
2,1,3,4 → 79 ; 2,1,4,3 → 69 ; 2,3,1,4 → 73 ; 2,3,4,1 → 43 ; 2,4,1,3 → 60 ; 2,4,3,1 → 40 ;
3,1,2,4 → 75 ; 3,1,4,2 → 55 ; 3,2,1,4 → 72 ; 3,2,4,1 → 42 ; 3,4,1,2 → 46 ; 3,4,2,1 → 36 ;
4,1,2,3 → 61 ; 4,1,3,2 → 51 ; 4,2,1,3 → 58 ; 4,2,3,1 → 38 ; 4,3,1,2 → 45 ; 4,3,2,1 → 35


n = 5 时,总和最小序列是 1、2、6、23、99
一共有Fact(5)=120种排列组合…………


n = 6 时,总和最小序列是 1、2、7、33、178、986
一共有Fact(6)=720种排列组合…………


n = 7 时,总和最小序列是 1、2、9、51、331、2179、14380
一共有Fact(5)=5040种排列组合…………


…………



评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-8-16 20:53 | 显示全部楼层
我的理解是计算机是从0开始计数的0,1,2,3,4。。。。A,B,C,D,E,F。,那么,16进制就是从0到F的16个数,10进制就是从0到9的10个数,二进制从0到1的2个数

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-22 13:23 | 显示全部楼层
增加一个循环任意字符的通用代码:
  1. Sub GetStrSeq()
  2.     '功能: 从字符串s中 截取 l - n 区间中任意的1个字符 组合成m个字符
  3.     Dim i&, j&, k&, l&, m&, n&, s$, t$, t1$, tms#
  4.     tms = Timer
  5.    
  6.     s = "abcd" '指定字符集构成的字符串s 顺序为从左到右
  7.     m = 10 '需要生成组合字符的个数m
  8.     n = 2: l = 1  '从指定字符集合中的取值范围 l To n
  9.                       '其中n=[1,m] 即1<=n<=m 而 l=[1,n] 即1<=l<=n
  10.     t1 = Mid(s, l, 1) '取得首字符 即最小字符

  11.     k = (n - l + 1) ^ m '计算全部组合字符的总数k
  12.     ReDim a&(1 To m) '定义数组a记录循环后的组合状态
  13.     ReDim b$(k, 0) '定义数组b存储各个组合结果

  14.     t = String(m, t1) '起始字符t 全部由最小字符t1组成、长度m
  15.     For j = 1 To m
  16.         a(j) = l '组合状态记录数组a初始化
  17.     Next
  18.     b(0, 0) = t '数组b首个结果赋值

  19.     For i = 1 To k
  20.         For j = m To 1 Step -1
  21.             If a(j) = n Then a(j) = l: Mid(t, j) = t1 Else a(j) = a(j) + 1: Mid(t, j) = Mid(s, a(j), 1): Exit For
  22.             '本位到n时则升位(本位归零=t1、继续检查左一位)、否则本位+1后结束 结果Mid置换得到当前组合
  23.         Next
  24.         b(i, 0) = t '记录本次组合得到的字符串结果
  25.     Next

  26.     [a1].CurrentRegion = "": [a1].Resize(k) = b: [a1].EntireColumn.AutoFit 'A列输出结果
  27.     MsgBox Format(Timer - tms, "0.00s ") & k
  28. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2015-1-28 19:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
aoe1981 发表于 2014-8-14 23:17
  能力出众,观念超前,代码神奇,需花时间理解啊……真是超人级别的!

确实是超人!佩服,跟着学习。谢谢不吝赐教。

TA的精华主题

TA的得分主题

发表于 2017-3-21 15:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
真是超人级别的!

TA的精华主题

TA的得分主题

发表于 2020-5-24 22:46 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-2 23:12 , Processed in 0.037204 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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