回 帖 发 新 帖 刷新版面

主题:Moz 的排列组合

----------------------------------------------------------------------
取消停止位置
改为无穷下一[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 楼

让我想起原来的faintzw,不知道现在还来论坛不,那时候他用深搜搞过排列组合,应该还在精华区里吧

12 楼

顶一下.不让好帖.下跌..
好..就是看了好久了.没有看出名堂!

13 楼

moz 是高手!! 

14 楼

排列公式:Pn = n!
                    m!
组合公式:Cmn = -----------
                 n!*(m-n)!

15 楼

在各位看来我是新手,moz,您讲的有点让人听不懂哎

16 楼

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 楼

上面是排列,下面是从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 楼

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 楼

其实根本不需要用字符串!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册