注册 登录
编程论坛 VFP论坛

取排列组合数,翻出来的以前垃圾代码

sych 发布于 2023-10-16 12:02, 311 次点击
使用方法?plzhnum(10,5,100,1)  &&输出从10(第一个参数)个中取5(第二个参数)个的全排列的第100(第三个参数)位排列
        ?plzhnum(10,5,100,0)  &&输出从10(第一个参数)个中取5(第二个参数)个的全组合的第100(第三个参数)位组合

proc plzhnum
lpara n,m,s,p
local z,jg,num,j,i,num0,pl,zh
note plzh(n,m,p),S为plzh(n,m,p)的第S条记录
z=plzh(m.n,m.m,m.p)
jg=''
if EMPTY(m.p)
  if m.s<m.z
    num=0
    j=1
    do whil m.num<m.s
      i=iif(''=m.jg,1,val(subs(m.jg,rat(',',m.jg)+1))+1)
      do whil m.num<s and m.n-m.i>=m.m-m.j
        num0=plzh(m.n-m.i,m.m-m.j,0)
        num=m.num+m.num0
        i=m.i+1
      enddo
      jg=m.jg+','+ltri(str(m.i-1))
      num=iif(m.s<m.num,m.num-m.num0,m.num)
      j=m.j+1
    enddo
  endif
  do whil occu(',',m.jg)<m.m
    jg=m.jg+','+ltri(str(m.n-m.m+1+occu(',',m.jg)))
  enddo
  jg=m.jg+','
else
  pl=plzh(m.m,m.m,1)
  if m.s<m.z
    zh=ceil(m.s/m.pl)
    num=0
    j=1
    do whil m.num<m.zh
      i=iif(''=m.jg,1,val(subs(m.jg,rat(',',m.jg)+1))+1)
      do whil m.num<m.zh and m.n-m.i>=m.m-m.j
        num0=plzh(m.n-m.i,m.m-m.j,0)
        num=m.num+m.num0
        i=m.i+1
      enddo
      jg=m.jg+','+ltri(str(m.i-1))
      num=iif(m.zh<m.num,m.num-m.num0,m.num)
      j=m.j+1
    enddo
    num=mod(m.s-1,m.pl)+1
  else
    num=m.pl
  endif
  do whil occu(',',m.jg)<m.m
    jg=m.jg+','+ltri(str(m.n-m.m+1+occu(',',m.jg)))
  enddo
  zh=m.jg+','
  jg=','
  for m.i=1 to m.m
    pl=plzh(m.m-m.i,m.m-m.i,1)
    j=subs(m.zh,at(',',m.zh,ceil(m.num/m.pl)))
    j=left(m.j,at(',',m.j,2))
    zh=stuf(m.zh,at(m.j,m.zh),len(m.j),',')
    jg=m.jg+righ(m.j,len(m.j)-1)
    num=mod(m.num-1,m.pl)+1
  endfor
endif
retu m.jg

proc plzh
lpara n,m,plorzh
local cj,i
cj=1
for i=m.n-m.m+1 to m.n
  cj=m.cj*m.i
endfor
if EMPTY(m.plorzh)
  for m.i=2 to m.m
    cj=m.cj/m.i
  endfor
endif
retu  m.cj
2 回复
#2
schtg2023-10-16 15:22
回复 楼主 sych
学习啦,谢谢!
#3
sych2023-10-17 11:26
列出所有从1-10个数字中取出3个数字的全排列
for i=1 to plzh(10,3,1)
    ?plzhnum(10,3,i,1)
next

1