主题:Moz 的排列组合
moz
[专家分:37620] 发布于 2005-12-11 10:15:00
----------------------------------------------------------------------
取消停止位置
改为无穷下一[size=4]排列[/size]:
顺序:从小到大循环
function nextpl$(a$)
l=len(a$)
for e=(l-1) to 1 step -1
if mid$(a$,e,1)<mid$(a$,e+1,1) then exit for
next
if e>0 then
FOR i = l TO (e + 1) STEP -1
IF MID$(a$, i, 1) > MID$(a$, e, 1) THEN EXIT FOR
NEXT
b$ = MID$(a$, i, 1)
MID$(a$, i, 1) = MID$(a$, e, 1)
MID$(a$, e, 1) = b$
end if
FOR i = (e + 1) TO (l + e + 1) \ 2
j = l + e + 1 - i
b$ = MID$(a$, i, 1)
MID$(a$, i, 1) = MID$(a$, j, 1)
MID$(a$, j, 1) = b$
NEXT
nextpl$=a$
end function
-----------------------------------------------------------
[size=4]组合[/size]函数
顺序:由后至前循环。
可以很方便的和之前做的排列函数结合使用
只是存在一个缺点,就是不能有相同重复的字符
利用的字符串,当然,只要你有需要,
你可以很方便的延伸出去的。
function nextzh$(a$,b$)
for i=1 to len(b$)
if instr(1,a$,mid$(b$,i,1))>i then
mid$(b$,1,i)=mid$(a$,instr(1,a$,mid$(b$,i,1))-i,i)
exit for
endif
next
if i>len(b$) then b$=right$(a$,len(b$))
nextzh$=b$
end function
-----------------------------------------------------------------------------
[size=4]排列组合的联用[/size]
.......未完待续......
回复列表 (共19个回复)
11 楼
rickone [专家分:15390] 发布于 2006-01-16 04:02:00
让我想起原来的faintzw,不知道现在还来论坛不,那时候他用深搜搞过排列组合,应该还在精华区里吧
12 楼
net56789 [专家分:210] 发布于 2006-01-27 18:08:00
顶一下.不让好帖.下跌..
好..就是看了好久了.没有看出名堂!
13 楼
mingzhentanq [专家分:60] 发布于 2006-04-01 20:57:00
moz 是高手!!
14 楼
mxalbert1996 [专家分:780] 发布于 2006-08-11 12:44:00
排列公式:Pn = n!
m!
组合公式:Cmn = -----------
n!*(m-n)!
15 楼
我爱qbasic [专家分:160] 发布于 2009-04-19 19:04:00
在各位看来我是新手,moz,您讲的有点让人听不懂哎
16 楼
gadenflm [专家分:150] 发布于 2009-04-21 20:59:00
cls
input n
dim a(n)
i=1
do while i<>0
a(i)=a(i) + 1
if a(i) > n then
a(i) =0 : i=i-1
else
f=1
for j =1 to i - 1
if a(i) =a(j) then f=0 : exit for
next j
if f>0 then
if i=n then
for j =1 to n
print a(j) ;
next j
print
s=s+1
else
i=i+1
end if
end if
end if
loop
print "SUM=";s
17 楼
gadenflm [专家分:150] 发布于 2009-04-21 21:03:00
上面是排列,下面是从n中取m个数组合。
cls
input n,m
dim a(n)
i=1
do while i<>0
a(i)=a(i) + 1
if a(i) > n then
a(i) =0 : i=i-1
else
f=1
for j =1 to i - 1
if a(i)<=a(j) then f=0 : exit for
next j
if f>0 then
if i=m then
for j =1 to m
print a(j) ;
next j
print
s=s+1
else
i=i+1
end if
end if
end if
loop
print "SUM=";s
18 楼
phile [专家分:2310] 发布于 2009-07-31 09:07:00
moz先生,你的程序有点烦!
全排列:
CLS
INPUT N
DIM A(N)
S=1
FOR I=1 TO N
INPUT A(I)
S=S*I
NEXT I
FOR I=1 TO S
FOR J=1 TO N
PRINT USING"#";A(I);
NEXT J
PRINT " ";
K=N
DO WHILE A(K)<=A(K-1)
K=K-1
LOOP
J=N
DO WHILE A(J)<=A(K-1)
J=J-1
LOOP
SWAP A(J),A(K-1)
FOR H=K TO N-1
FOR P=H+1 TO N
IF A(H)>A(P) THEN SWAP A(H),A(P)
NEXT P,H
NEXT I
组合
CLS
INPUT N,M
DIM A(M),B(M)
FOR I=1 TO M
INPUT A(I)
B(I)=I
NEXT I
DO WHILE B(0)=0
FOR J=1 TO M
PRINT USING"#";A(B(J));
NEXT J
PRINT " ";
K=M
DO WHILE B(K)=N-M+K
K=K-1
LOOP
B(K)=B(K)+1
FOR J=K+1 TO M
B(J)=B(J-1)+1
NEXT J
LOOP
END
我只是个五年级的小学生!
19 楼
phile [专家分:2310] 发布于 2009-07-31 09:08:00
其实根本不需要用字符串!!!
我来回复