初学者的简单问题,关于字母的排列(100分)

wenquan836 2005-09-30 06:12:35
问题是这样的:

有N个字母,按每S个分组,可以有多少种不同的组合?(不分前后顺序)
例如:
ABCDEF 有六个字母 按每4个分为一组可以得到:

ABCD;ABCE;ABCF;ABDE;ABDF
ACDE;ACDF;ACEF;ADEF;BCDE;BCDF;
BDEF;CDEF

共13种组合。(不知道上面有没有排列错掉)

N和S是未知数。

想了好几个晚上也没有想出来。
...全文
316 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
northwolves 2005-11-21
  • 打赏
  • 举报
回复
楼主做字典吧
rainstormmaster 2005-11-21
  • 打赏
  • 举报
回复
//当n>32时i的值会溢出!

溢出你就换一个数据类型,还有,你的字母数有上限吗?
wenquan836 2005-11-21
  • 打赏
  • 举报
回复
用这种算法不可取:原因

Sub GETALL(ByVal num As Integer, ByRef x As Variant, ByRef RESULT() As String, Optional ByRef all As Long)

Dim A() As String, b() As Integer '临时数组
Dim n As Integer ' 数组元素个数
Dim i As Long '循环变量
Dim TEMP As Long '二进制转换中间变量
Dim num2 As Integer '中间计数变量
n = UBound(x) - LBound(x) + 1 '数组元素个数
If num > n Then MsgBox "ERR!", vbInformation, "WARNING": Exit Sub
ReDim b(0 To n - 1)
all = 0
For i = 0 To 2 ^ n - 1 ' 当n>32时i的值会溢出!TEMP = i
num2 = 0
For j = 0 To n - 1 '转换为二进制
b(j) = TEMP And 1 '0 or 1
TEMP = TEMP \ 2
If b(j) = 1 Then
num2 = num2 + 1
ReDim Preserve A(1 To num2)
A(num2) = x(LBound(x) + j)
End If
Next
If num2 = num Then
all = all + 1
ReDim Preserve RESULT(1 To all)
RESULT(all) = Join(A, "") '结果保存
Debug.Print RESULT(all) '输出
End If
Next
Debug.Print "从 " & n & " 个元素的数组中选 " & num; " 个元素, 共 " & all & "种组合!"
End Sub

Private Sub Command1_Click()
Dim x, i As Integer
Dim out() As String
x = Array("A", "B", "C", "D", "E", "F")
GETALL 4, x, out
End Sub

当n>32时i的值会溢出!
province_ 2005-10-01
  • 打赏
  • 举报
回复
n
Cm=m*(m-1)*....*(M-n+1)/n!
高中的数学啊。
northwolves 2005-09-30
  • 打赏
  • 举报
回复
Sub GETALL(ByVal num As Integer, ByRef x As Variant, ByRef RESULT() As String, Optional ByRef all As Long)

Dim A() As String, b() As Integer '临时数组
Dim n As Integer ' 数组元素个数
Dim i As Long '循环变量
Dim TEMP As Long '二进制转换中间变量
Dim num2 As Integer '中间计数变量
n = UBound(x) - LBound(x) + 1 '数组元素个数
If num > n Then MsgBox "ERR!", vbInformation, "WARNING": Exit Sub
ReDim b(0 To n - 1)
all = 0
For i = 0 To 2 ^ n - 1 '循环
TEMP = i
num2 = 0
For j = 0 To n - 1 '转换为二进制
b(j) = TEMP And 1 '0 or 1
TEMP = TEMP \ 2
If b(j) = 1 Then
num2 = num2 + 1
ReDim Preserve A(1 To num2)
A(num2) = x(LBound(x) + j)
End If
Next
If num2 = num Then
all = all + 1
ReDim Preserve RESULT(1 To all)
RESULT(all) = Join(A, "") '结果保存
Debug.Print RESULT(all) '输出
End If
Next
Debug.Print "从 " & n & " 个元素的数组中选 " & num; " 个元素, 共 " & all & "种组合!"
End Sub

Private Sub Command1_Click()
Dim x, i As Integer
Dim out() As String
x = Array("A", "B", "C", "D", "E", "F")
GETALL 4, x, out
End Sub


输出:

ABCD
ABCE
ABDE
ACDE
BCDE
ABCF
ABDF
ACDF
BCDF
ABEF
ACEF
BCEF
ADEF
BDEF
CDEF
从 6 个元素的数组中选 4 个元素, 共 15种组合!


参看拙作:http://blog.csdn.net/northwolves/archive/2004/07/25/51090.aspx
bugxiong 2005-09-30
  • 打赏
  • 举报
回复
把ABCDEF都取出 按一个一个字母设为数组x(N)
s=""
for i= x(1) to x(N)
s=s+i
for i1=去除第一个后的x(1)-x(N)
s=s+i1
for iN=去除第N个后的x(1)-x(n)
s=s+iN
....
....

next

next
Summer006 2005-09-30
  • 打赏
  • 举报
回复
倒掉。排列组合的问题。网上查查,算法就一个公式,n,s 带入一算就出来了

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧