Excel精英培训网

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

[已解决]请教一个数字排列组合的问题

[复制链接]
发表于 2016-6-16 16:43 | 显示全部楼层 |阅读模式
请教两个问题
问题1:
4个字母 选择3个拼成一个字符串
可以拼成
ABC
ABD
ACD
BCD

那么10个数选6个拼成字符串
又是多少呢
请大侠帮忙写一个通用函数
'@@@@@@@@@@@@@@@@@@@@@@@@@@
问题2:字符串ABC三个元素
组合
结果为
ABC
ACB
BAC
BCA
CAB
CBA

位置不同也算不同
那么5个元素组合出来的结果呢
又是多少呢
请大侠帮忙写一个通用函数
最佳答案
2016-6-17 21:19
本帖最后由 JX_shangrila 于 2016-6-17 22:41 编辑

递归代码不是那么容易,看过几位大师的代码。你的二个问题蓝版和香川大师都写过很好的代码,在我以前学习和消化的基础上,略作修改。第一个问题是过程abc,第二个问题是过程abcd。
Dim brr(1 To 1000, 1 To 1)
Dim arr, k%, n%, sj
Sub abc()
   k = 0:   Erase brr
   arr = Range("a2:a" & Range("a65536").End(xlUp).Row)
   dg arr, 1, "", 0
   Range("c2").Resize(1000) = ""
   Range("c2").Resize(k) = brr
End Sub
Sub dg(arr, t, str, y)
    If y = [b2] Then k = k + 1:brr(k, 1) = str:Exit Sub   
    If t < UBound(arr) + 1 Then
       dg arr, t + 1, str & arr(t, 1), y + 1
       dg arr, t + 1, str, y
    End If
End Sub

Sub abcd()
    k = 0: n = [b2]: Erase brr
    arr = Range("a2:a" & Range("a65536").End(xlUp).Row)
    Call dg1(arr, 0, "", 0)
    Range("c2").Resize(1000) = ""
    Range("c2").Resize(k) = brr
End Sub
Sub dg1(arr, t, str, y)
    If y = n Then sj = Split(str, ","): Call dg2("", 0, 1): Exit Sub
    For j = t + 1 To UBound(arr)
        Call dg1(arr, j, str & "," & arr(j, 1), y + 1)
    Next
End Sub
Sub dg2(str$, i%, t%)
    str = Replace(str, " ", "")
    If t > n And Len(Trim(str)) = n Then k = k + 1: brr(k, 1) = str
    If t <= n Then Call dg2(str & sj(t), t, t + 1)
    If i > 1 Then Call dg2(Right(str, 1) & Left(str, (t - 2)), i - 1, t)
End Sub




发表于 2016-6-16 16:57 | 显示全部楼层
组合算法以及结果输出
http://www.excelpx.com/thread-333408-1-1.html


楼主也是学习通用写法?我还木学会

评分

参与人数 1 +3 收起 理由
QCW911 + 3 来学习

查看全部评分

回复

使用道具 举报

发表于 2016-6-16 17:09 | 显示全部楼层
爱疯 发表于 2016-6-16 16:57
组合算法以及结果输出
http://www.excelpx.com/thread-333408-1-1.html

我只是提供了一个学习贴,我还没学会。
最佳还是留给解决你的问题的朋友吧!谢谢


回复

使用道具 举报

发表于 2016-6-17 21:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 JX_shangrila 于 2016-6-17 22:41 编辑

递归代码不是那么容易,看过几位大师的代码。你的二个问题蓝版和香川大师都写过很好的代码,在我以前学习和消化的基础上,略作修改。第一个问题是过程abc,第二个问题是过程abcd。
Dim brr(1 To 1000, 1 To 1)
Dim arr, k%, n%, sj
Sub abc()
   k = 0:   Erase brr
   arr = Range("a2:a" & Range("a65536").End(xlUp).Row)
   dg arr, 1, "", 0
   Range("c2").Resize(1000) = ""
   Range("c2").Resize(k) = brr
End Sub
Sub dg(arr, t, str, y)
    If y = [b2] Then k = k + 1:brr(k, 1) = str:Exit Sub   
    If t < UBound(arr) + 1 Then
       dg arr, t + 1, str & arr(t, 1), y + 1
       dg arr, t + 1, str, y
    End If
End Sub

Sub abcd()
    k = 0: n = [b2]: Erase brr
    arr = Range("a2:a" & Range("a65536").End(xlUp).Row)
    Call dg1(arr, 0, "", 0)
    Range("c2").Resize(1000) = ""
    Range("c2").Resize(k) = brr
End Sub
Sub dg1(arr, t, str, y)
    If y = n Then sj = Split(str, ","): Call dg2("", 0, 1): Exit Sub
    For j = t + 1 To UBound(arr)
        Call dg1(arr, j, str & "," & arr(j, 1), y + 1)
    Next
End Sub
Sub dg2(str$, i%, t%)
    str = Replace(str, " ", "")
    If t > n And Len(Trim(str)) = n Then k = k + 1: brr(k, 1) = str
    If t <= n Then Call dg2(str & sj(t), t, t + 1)
    If i > 1 Then Call dg2(Right(str, 1) & Left(str, (t - 2)), i - 1, t)
End Sub




回复

使用道具 举报

发表于 2016-6-17 21:27 | 显示全部楼层
表格数据按下图


7OX35G310}KG(B0RANY4~K8.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-4 21:59 , Processed in 0.295962 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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