Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1681|回复: 16

[已解决]表格编写代码求助

[复制链接]
发表于 2021-12-2 10:56 | 显示全部楼层 |阅读模式
路过的各位大侠好!

从10-39选3个数字组成一组,如10 22 31可以组成多少组?把这些组合冠以代码1-1000,相邻的四组代码不含相同的数,用表格怎么实现?

最佳答案
2021-12-7 19:13
华华英雄 发表于 2021-12-7 14:01
这个不错!谢谢了!
如果按我说的对位的话,如何修改?请闲的时候帮忙改一下。

...

附件请测试,1000组结果里面只重排了845组,其余的需要自己手工查找插入。
发表于 2021-12-2 11:58 | 显示全部楼层
1、第一个问题好回答,就是数学的排列组合。
     如果是指强调顺序的排列数,就是 39*38*37...*30,感觉是个天文数字;
     如果是不强调顺序的组合数,就是 39!/(29!*10!),比上面小一些,但也是个天文数字;
2、第二个问题看不懂,“冠以代码”是什么意思?相邻的4组与选取的3个数是个什么关系?
     考虑到排列组合都是天文数字,所以你这个问题基本算无解吧,可能会远超100万行,excel放不下,运行时间或许会超长甚至死机;

只是我个人的看法,你再参考大佬的意见吧
回复

使用道具 举报

发表于 2021-12-2 20:03 | 显示全部楼层
10-39一共30个数,每次抽取3个不同的数,共有combin(30,3)=4060组;
每组3个数,共6种排列顺序,全组合+全排列的情况下4060*6=24360组,这个不难;
还是详细说说下面半段的意思吧。
回复

使用道具 举报

发表于 2021-12-2 21:09 | 显示全部楼层
本帖最后由 蜀西 于 2021-12-2 21:11 编辑
大灰狼1976 发表于 2021-12-2 20:03
10-39一共30个数,每次抽取3个不同的数,共有combin(30,3)=4060组;
每组3个数,共6种排列顺序,全组合+全 ...

版主大哥,帮我看一下


这个错误提示怎么修改?
这段代码能正确的输出需要的结果,但就是有一个错误提示。

回复

使用道具 举报

发表于 2021-12-2 21:13 | 显示全部楼层
蜀西 发表于 2021-12-2 21:09
版主大哥,帮我看一下

i是从0到99循环,c是1000000,i*c算式从i=1开始,结果就是100万了,而excel2003以上版本的最大行数也就104万,可想而知,i=2时就超出最大行数了,offset()肯定出错。
回复

使用道具 举报

发表于 2021-12-2 21:14 | 显示全部楼层
本帖最后由 蜀西 于 2021-12-2 21:31 编辑
大灰狼1976 发表于 2021-12-2 21:13
i是从0到99循环,c是1000000,i*c算式从i=1开始,结果就是100万了,而excel2003以上版本的最大行数也就10 ...
懂了。拜服!
回复

使用道具 举报

 楼主| 发表于 2021-12-3 09:04 | 显示全部楼层
大灰狼1976 发表于 2021-12-2 20:03
10-39一共30个数,每次抽取3个不同的数,共有combin(30,3)=4060组;
每组3个数,共6种排列顺序,全组合+全 ...

1、运算生成4060组号码组,2、对4060组号码组进行排序,冠以代码1-4060,相邻的四组号码组不能有相同的数。
3、结果就是这4060组号码的重新排序情况。
比如:10 11 12  
         13 14 15
         16 17 18
         19 20 21
回复

使用道具 举报

发表于 2021-12-3 10:31 | 显示全部楼层
华华英雄 发表于 2021-12-3 09:04
1、运算生成4060组号码组,2、对4060组号码组进行排序,冠以代码1-4060,相邻的四组号码组不能有相同的数 ...

1简单,2我要想一下
回复

使用道具 举报

发表于 2021-12-3 14:23 | 显示全部楼层
怎么个相邻法?
A
B
C
D
E
F
G
H
请问D相邻的4个,是不是 A B C D E F G,上三,下三,这个地方没有说清楚。
不重复的3个数组合一共是4060组,代码如下,你其他要求再遍历判断提取就可以了:
Dim arr1(1 To 200000, 1 To 1)
Dim k As Integer
Sub 递归数组()
    k = 0
    Erase arr1
    Dim arr
    arr = Range("a1:a30")
    zuhe arr, 1, "", 0
    Range("b:b") = ""
    Range("b1").Resize(k) = arr1
    Dim arr2
    arr2 = Range("b1:b" & k)
    For i = 1 To k
        If arr2(i, 1) Then         
        End If
    Next i
End Sub
Sub zuhe(arr, x, sr As String, y)
If y = 3 Then
    k = k + 1
    arr1(k, 1) = sr
    Exit Sub
End If
    If x < UBound(arr, 1) + 1 Then
        zuhe arr, x + 1, sr & arr(x, 1) & " ", y + 1
        zuhe arr, x + 1, sr, y
    End If
End Sub


回复

使用道具 举报

 楼主| 发表于 2021-12-4 11:35 | 显示全部楼层
林木水 发表于 2021-12-3 14:23
怎么个相邻法?
A
B

ABCD,BCDE,CDEF,DEFG------没有相同的数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 16:17 , Processed in 0.438065 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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