求如何用程序实现将所有排列组合打印出来

lovebaby 2006-12-25 10:42:17
01 02 03 04 05 06 07七个数,任意6个数字组合排列,可以有7种组合,我现在要把这7种组合全部打印出来,应该怎么做呢?我要的是一种通过方法,也就是说每一个单个数字之间并没有什么规律,比如也可能是02 05 10 12 15 20 26,数字个数也可能不同,可以是任意个数,怎么实现呢?大虾们帮帮忙,谢谢了!

用javascript或(asp)vbscript实现都可以。我查了可能要用到递归,但我不清楚怎么去递归。
...全文
446 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_7di_net 2007-03-20
  • 打赏
  • 举报
回复
http://hi.baidu.com/see7di/blog/item/7dca1a238bd3594f93580742.html
www_7di_net 2007-03-20
  • 打赏
  • 举报
回复
http://hi.baidu.com/see7di/blog/item/7dca1a238bd3594f93580742.html
wanghui0380 2006-12-26
  • 打赏
  • 举报
回复
这里有个vb的,做大数量的主要是防止溢出,我在以前那个固顶的帖子里是直接用的2进制运算的,Oct()函数,最大可到 11 位的八进制字符,在大就溢出了
'窗体中需两个Text、两个Label、一个Command
Option Explicit
Private mlngAllNumCount As Long, mlngGetNumCount As Long
Private mblnCancelProc As Boolean, mlngCurResultCount As Long
Private mastrOneResult() As String
Private mlngFileNo As Long, mstrResultFile As String

Private Sub Form_Load()
Command1.Caption = "处理"
mstrResultFile = App.Path & "\1.txt" '存放输出结果的文件,结果多时,不要尝试用记事本打开!会死机的。
End Sub
Private Sub Form_Unload(Cancel As Integer)
mblnCancelProc = True
End Sub
Private Sub Command1_Click()
Dim t As Single, i As Long
If Command1.Caption = "处理" Then
mlngAllNumCount = Text1.Text '数字总个数
mlngGetNumCount = Text2.Text '每组要取的数字个数
i = Zhuhe(mlngAllNumCount, mlngGetNumCount)
If i = 0 Then
MsgBox "结果太多,请不要尝试了!"
Exit Sub
End If
Label2.Caption = i
t = Timer
mblnCancelProc = False '中断处理的标志
Command1.Caption = "停止"
mlngCurResultCount = 0 '已产生出的组合总数
ReDim mastrOneResult(1 To mlngGetNumCount)
mlngFileNo = FreeFile
Open mstrResultFile For Output As #mlngFileNo
ListNum 1, 1
Close #mlngFileNo
Label1.Caption = mlngCurResultCount
Command1.Caption = "处理"
Me.Caption = Timer - t
Else
mblnCancelProc = True
End If
End Sub
Private Function Zhuhe(AllNum As Long, GetNum As Long) As Long
'算组合总数的过程,为防溢出,而做了特别设计
'只要结果总数在20亿以内,都不会溢出的
'太大的数不太可能会完成穷举,本程序也就不做尝试了
'接近溢出的上限列举:65536取2、2345取3、477取4、193取5、110取6
'75取7、58取8、49取9、40取10、39取11、37取12、35取13、34取15、33取16等

Dim i As Long, j As Long, k As Long, colget As Collection
Dim m As Long, n As Long, Num(1) As Long
On Error GoTo fail
Num(0) = 1
Set colget = New Collection '保存分母中的所有乘数(GetNum!)
For i = GetNum To 2 Step -1
colget.Add i
Next
For i = AllNum To AllNum - GetNum + 1 Step -1 '分子中所有乘数循环相乘
'让两个乘数尽可能与分母约分
Num(1) = i
For k = 0 To 1
m = colget.Count
If m > 0 Then
n = m
For j = 1 To m
If j > n Then Exit For
If Num(k) Mod colget(j) = 0 Then
Num(k) = Num(k) \ colget(j)
colget.Remove j
n = n - 1
j = j - 1
End If
Next
End If
Next
Num(0) = Num(0) * Num(1) '分子中的两个乘数分别约去分母再相乘,可防中间过程的溢出
Next
Zhuhe = Num(0)
Exit Function
fail:
End Function
Private Sub ListNum(ByVal Start As Long, ByVal Level As Long)
Dim i As Long
If mblnCancelProc Then Exit Sub
For i = Start To mlngAllNumCount - mlngGetNumCount + Level
mastrOneResult(Level) = i
If Level < mlngGetNumCount Then '是否到了最底层
ListNum i + 1, Level + 1 '没到底,递归啦,这是本过程的核心,很简单哟
Else
Print #mlngFileNo, Join(mastrOneResult, vbTab) '递归到最深层,就可以输出了
mlngCurResultCount = mlngCurResultCount + 1
If mlngCurResultCount Mod &H2000& = 0 Then
Label1.Caption = mlngCurResultCount '显示实际找出了多少组数字
DoEvents
End If
End If
Next
End Sub
lovebaby 2006-12-26
  • 打赏
  • 举报
回复
能帮我把上面我写的代码改成递归形式,我想试下效率
lovebaby 2006-12-26
  • 打赏
  • 举报
回复
23取6个数的不重组合应该有100947个。楼上,我是不是用vbs或js不能很好的解决这个问题,我也发现16是个上限,有没有其它解决办法。
wanghui0380 2006-12-26
  • 打赏
  • 举报
回复
这个问题本版讨论过很多次,甚至被版主固定过

结果:VBs,js最多可以弄到16个数字,再多就无法运行了
wanghui0380 2006-12-26
  • 打赏
  • 举报
回复
smartcatiboy() ( )的代码是可以的,基于统计的标靶分布,只要有运行足够次数,根据抽屉原则,是可以覆盖整个标靶的

另:23个数取7那可是23的7次方,一个恐怖的数字!
23^7 = 3 404 825 447
lovebaby 2006-12-26
  • 打赏
  • 举报
回复
顶一下,以下是我研究出来的代码,虽然可以实现,但如果数字多了之后,效率会大打折扣,超时15个,每多一个计算机就会响应好长时间,太大了干脆就死在那了。我在想用递归是否可以实现,如果递归实现效率是否会好些,或用其他算法。
<%
Server.script_Timeout = 999
str = "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23"
arr = Split(str,",")
length = UBound(arr) + 1
For i = 0 To length
For j = i + 1 To length-1
For n = j + 1 To length-1
For w = n + 1 To length-1
For e = w + 1 To length-1
For r = e + 1 To length-1
my_String = my_String & arr(i)&" "&arr(j)&" "&arr(n)&" "&arr(w)&" "&arr(e)&" "&arr(r) & "<br>"
Next
Next
Next
Next
Next
Next
teststr = Split(my_String,"<br>")
Response.Write(UBound(teststr))
%>
lovebaby 2006-12-25
  • 打赏
  • 举报
回复
谢谢。楼上可能没明白我的意思吧。我是要从r个元素中取n个数的不同组合。比如任意7个不同数字,取6个不同数字的组合,或任意12个数字,再取6个不同数字的不同组合。
类似于这种:
http://kuhuo4321.spaces.live.com/
smartcatiboy 2006-12-25
  • 打赏
  • 举报
回复
不需要递归,把下面的代码考到htm里试试,可以自动生成100个随机数

<script language=vbs>
test:sub test()
dim aryTest
aryTest=split("01,02,03,04,05,06,07,08,09,00",",")
dim i
for i=0 to 99
document.write join(GetRndString(aryTest)) & "<br>"
next
end sub



function GetRndString(byval arystrIn)
randomize

dim intBound,intTmpBound
dim intSelectedPosition
dim i

intBound=ubound(arystrIn)
intTmpBound=intBound
redim arystrOut(intBound)

for i=0 to intBound
intSelectedPosition=cint(rnd*intTmpBound)
arystrOut(i)=arystrIn(intSelectedPosition)
arystrIn(intSelectedPosition)=arystrIn(intTmpBound)
if intTmpBound>0 then intTmpBound=intTmpBound-1
next

GetRndString=arystrOut
end function
</script>

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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