VB全排列算法。

作者&投稿:齐柱 (若有异议请与网页底部的电邮联系)
求全排列组合算法的VB源代码~

'1、全排列 P(n)=N! 自定义函数PL:
Function PL(byval N as integer)
PL=1:i=1
do while i<=N
PL=PL*i
loop
End Fuction
'2、组合 ZH(N,K)=N!/(N-K)!/K! 的自定义函数,从N个种取K个的组合数:
Function ZH(Byval N as integer,K as INteger)
' 调用了上面的排列函数 PL
ZH=PL(N)/PL(N-K)/PL(K)
End Function

OptionExplicit'修改:TZWSOHOPrivateSubCommand1_Click()DimntAsDouble:nt=TimerList1.Visible=False:List1.ClearPermutation,Text1.TextList1.Visible=TrueDebug.PrintTimer-nt,EndSub'递归求全排列'算法描述:'以8位为例,求8位数的全排列,其实是8位中任取一位'在后加上其余7位的全排列'7位:任取一位,其后跟剩下6位的全排列'……'这样就有两部分,一部分为前面的已经取出来的串,另一部分为后面即将进行的全排列的串'参数pre即为前面已经取出来的串'参数str即为将要进行排列的串PrivateSubPermutation(preAsString,sAsString)DimiAsLong'//如果要排列的串长度为1,则返回IfLen(s)=1ThenList1.AddItempre&s:ExitSub'//for循环即是取出待排列的串的任一位Fori=1ToLen(s)'//递归,将取出的字符并入已经取出的串'//那么剩下的串即为待排列的串Permutationpre&Mid$(s,i,1),Left$(s,i-1)&Mid$(s,i+1)NextEndSub

新建一个工程,在窗体上新建一个text1,一个command1,把以下代码复制到工程中运行试试

Option Explicit

Private List() As String

Public index&, tmp$

Private Sub Command1_Click()

    ReDim List(Len(Trim(Form1.Text1.Text)))

    For index = 1 To Len(Trim(Form1.Text1.Text))

        List(index) = Mid(Form1.Text1.Text, index, 1)

    Next index

    Perm List, 1, Len(Trim(Form1.Text1.Text))

End Sub

Private Sub Form_Load()

    Form1.AutoRedraw = True

End Sub

Public Function Swap(ByRef Num1 As String, ByRef Num2 As String) '交换两个数

    tmp = Num1

    Num1 = Num2

    Num2 = tmp

End Function

Public Function Perm(ByRef ListTar() As String, ByVal k As Long, ByVal m As Long)  '全排列函数

    Dim i&

    If k > m Then

        For i = 1 To m

            Print ListTar(i);

        Next i

        Print

    Else

        For i = k To m

            Swap ListTar(k), ListTar(i)

            Perm ListTar, k + 1, m

            Swap ListTar(k), ListTar(i)

        Next i

    End If

End Function

运行效果



'添加一个按钮,将下列代码复制到代码窗口
Private Sub Command1_Click()
Open "c:\9阶乘种.txt" For Output As #1
Close #1
For i1 = 1 To 9
For i2 = 1 To 9
If i2 = i1 Then GoTo G2
For i3 = 1 To 9
If i3 = i1 Or i3 = i2 Then GoTo G3
For i4 = 1 To 9
If i4 = i1 Or i4 = i2 Or i4 = i3 Then GoTo G4
For i5 = 1 To 9
If i5 = i1 Or i5 = i2 Or i5 = i3 Or i5 = i4 Then GoTo G5
For i6 = 1 To 9
If i6 = i1 Or i6 = i2 Or i6 = i3 Or i6 = i4 Or i6 = i5 Then GoTo G6
For i7 = 1 To 9
If i7 = i1 Or i7 = i2 Or i7 = i3 Or i7 = i4 Or i7 = i5 Or i7 = i6 Then GoTo G7
For i8 = 1 To 9
If i8 = i1 Or i8 = i2 Or i8 = i3 Or i8 = i4 Or i8 = i5 Or i8 = i6 Or i8 = i7 Then GoTo G8
For i9 = 1 To 9
If i9 = i1 Or i9 = i2 Or i9 = i3 Or i9 = i4 Or i9 = i5 Or i9 = i6 Or i9 = i7 Or i9 = i8 Then GoTo G9
DoEvents
Open "c:\9阶乘种.txt" For Append As #1
k = i1 & i2 & i3 & i4 & i5 & i6 & i7 & i8 & i9
Print #1, k
Label1 = k
Close #1
G9:
Next i9
G8:
Next i8
G7:
Next i7
G6:
Next i6
G5:
Next i5
G4:
Next i4
G3:
Next i3
G2:
Next i2
G1:
Next i1
MsgBox "完成排列,请擦看!"
Shell "notepad.exe c:\9阶乘种.txt ", 1
End Sub

曾做过一道题,看算法。

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
enum color{one,two,three,four};
color pri;
int i,j,k,n=0,loop;
for (i=one;i<=four;i++)
for(j=one;j<=four;j++)
if(i!=j)
{ for (k=one;k<=black;k++)
if((k!=i)&&(k!=j))
{n=n+1;
cout<<setw(3)<<n;
for(loop=1;loop<=3;loop++)
{switch(loop)
{case 1:pri=color(i);break;
case 2:pri=color(j);break;
case 3:pri=color(k);break;
default:break;
}
switch(pri)
{case one:cout<<setw(8)<<"one";break;
case two:cout<<setw(8)<<"two";break;
case three:cout<<setw(8)<<"three";break;
case four:cout<<setw(8)<<"four";break;
default:break;
}
}
cout<<endl;
}
}
cout<<"total:"<<n<<endl;
return 0;
}

那个,怎样才算好?
private sub form_click()
dim level as long
dim num() as long
dim i as long
level=9
redim num(1 to level)
for i=1 to level
num(i)=i
next i
call printnum(num(),level,level)
end sub

private sub printnum(num() as long,level as long,total as long)
dim i as long,temp as long
if level=1 then
for i=1 to total
print num(i);
next i
print
else
call printnum(num(),level-1,total)
for i=1 to level-1
temp=num(level)
num(level)=num(level-1)
num(level-1)=temp
call printnum(num(),level-1,total)
next i
end if
end sub


全排列公式是什么?
全排列是指从N个不同元素中选取M个元素,并按照特定顺序排列,当M等于N时,我们称之为完全排列。排列的多样性取决于选取规则和排序方法。例如,对于集合A={a,b,c},其全排列包括A1={a,b,c}, A2={a,c,b}, A3={b,a,c}, A4={b,c,a}, A5={c,a,b}, A6={c,b,a},展示了三个...

数学的“全排列”是什么意思?
以集合A={a, b, c}为例,它的全排列包括A1={a, b, c}, A2={a, c, b}, A3={b, a, c}, A4={b, c, a}, A5={c, a, b}, A6={c, b, a}。N个元素的全排列总数是N的阶乘,表明了排列的多样性。全排列问题可以通过递归或非递归的方法解决。递归方法是通过一个数与它后面...

全排列计算公式是什么?
全排列计算公式是n的阶乘,即n!,也可以表示为n×(n-1)×(n-2)×...×3×2×1。全排列是指从n个不同元素中任取n个元素,按照一定的顺序排成一列,所有这样的排列方式的总数。例如,对于3个不同的元素A、B、C,其全排列有ABC、ACB、BAC、BCA、CAB和CBA...

将A、B、C、D、E 排成一列,要求A,B必须排在一起,而C,D不能排在一起...
把AB看成一个整体的时候,全部排列方法为4*3*2*1,这时,CD不在一起的方法为:全排列减去CD在一起,即:4*3*2*1-3*2*1*2。而AB又有AB和BA两种方法,所以为2*(4*3*2*1-3*2*1*2)=24。

全排列公式是什么?
以集合A={a,b,c}为例,按顺序列举出其全排列:A1={a,b,c}, A2={a,c,b}, A3={b,a,c}, A4={b,c,a}, A5={c,a,b}, A6={c,b,a}。N个元素的全排列的个数为N。递归与非递归的方法解决全排列问题:1、全排列就是从第一个数字起每个数分别与它后面的数字交换。2、去重的全...

数学的“全排列”是什么意思?
以集合A={a, b, c}为例,全排列包括A1={a, b, c}到A6={c, b, a}这6种不同的排列方式。对于N个元素的全排列,总数就是N,这意味着每个元素都有可能占据N个位置中的任意一个。解决全排列问题的方法包括递归和非递归两种。递归方法是从第一个元素开始,依次与后面每个数交换位置;非递归...

选排列和全排列的区别
全排列应该是把N个全部一起排列。组合就是从N个中选M个。举例有ABC三个人,选两个人去开会,那么不分前后(不考虑次序)的话,就可以有,A和B,A和C,B和C,三种组合。如果要就有ABC,ACB,BAC,BCA,CAB,CBA,六个全排列的方案。如果要ABC三个中选2人从左到右排队,则有AB,BA,AC,CA...

求A、B、C、D、E和F共6个字母的全排列中不允许出现ACE和DF图像的全排...
【答案】:设出现ACE图像的排列构成的集合为P,出现DF的图像的排列构成的集合为Q,则依条件有|P|=4!,|Q|=5!,|P∩Q|=3!,而全排列U为|U|=6!.根据包含排列原理,所求集合即满足的等式为:=|U|-|P|-|Q|+|P∪Q|=6!-4!-5!+3!=582.

a,b,C,d,e,f,g,h,讠九个字母全排列,要求b,e,g三个字母顺序不变,求这...
九个字母全排列共有9!方法,bef顺序不变除以3!,所以这样的排列共有9!÷3!=9×8×7×6×5×4=60480

有多少种不同的含有相同元素的全排列方法?
含有相同元素的全排列算法 总元素个数的阶乘依次除以每种元素相同元素的阶乘比如这里的共有1个abc,2个a,4个b和1个c一共8个单位进行含有相同元素的全排列总元素个数的阶乘8!依次除以每种元素相同元素的阶乘abc:1!,a:2!,b:4!,c:1!结果就是8! \/1! \/2! \/4! \/1!=840 其中仍然有重复的就...

石阡县19488739904: 一个数组中有若干元素,用VB如何编程实现全排列? -
归蚀盐酸: Option ExplicitPrivate Sub Form_Load() Dim i As Integer, j As Integer, k As Integer, strTemp$ For i = 1 To 3 For j = 1 To 3 For k = 1 To 3 If (i <> j And i <> k And j <> k) Then Debug.Print i & j & k Next k Next j Next iEnd Sub

石阡县19488739904: 求VB中二维数组的全排列? -
归蚀盐酸: Private Sub Command1_Click() '二维数组 M = 10 N = 10 ReDim T(1 To M, 1 To N) As String For i = 1 To M For i1 = 1 To N T(i, i1) = i1 Next Next '把二维维数值赋予新的一维数组 ReDim newt(1 To M * N) As String For i = 1 To M For i1 = 1 To N newt((i - 1) * N + i1) = T(1, i1) Next Next End Sub

石阡县19488739904: 在VB中如何计算数字1~9的所有可能排列? -
归蚀盐酸: Private Sub Command1_Click() Dim a(9) As Integer n = CInt(InputBox("N=")) Open "d:\1234.txt" For Output As #1 k = 1 For i = 1 To n a(i) = i k = k * i Next i For i1 = 1 To k For i = 1 To n Print #1, a(i); Next i Print #1, i = n - 1 Do While a(i) > a(i + ...

石阡县19488739904: 请高手指点编写一个vb全组合算法 -
归蚀盐酸: 组合算法 VB代码 Sub combine(a() As Integer, ByVal n As Integer, ByVal m As Integer, b() As Integer, ByVal L As Integer) Dim i As Integer Dim j As Integer For i = n To m Step -1 b(m - 1) = i - 1 If m > 1 Then combine a, i - 1, m - 1, b, L Else For j = ...

石阡县19488739904: 求一个vb按固定顺序排序的方法 -
归蚀盐酸: 想到一个方法,可能不是最好的;思路:1,把你要求的顺序,存放到一个数组; Yd(1)="王",Yd(2)="陈",Yd(3)="李",Yd(4)="赵",Yd(5)="张",Yd(6)="刘"2,另建一个数组; Nd(1)="",nd(2)="",nd(3)="",nd(4)="",nd...

石阡县19488739904: vb 求n数的所有排列
归蚀盐酸: Private Sub Command1_Click() Open App.Path & "\1.txt" For OutPut As #1 '这里可以改成你想要输出的文件 NFormM 1, 3,3 Close #1 MsgBox "输出完毕" End Sub Function NFormM(ByVal iStart As Integer, iEnd As Integer, Num As Integer, ...

石阡县19488739904: VB的排序法的代码 -
归蚀盐酸: 排序的各类很多,最简单的冒泡排序代码如下:Private Sub Command1_Click() Dim a(), i As Integer, j As Integer, tmp As Integer a = Array(1, 3, 2, 5, 4, 6, 9, 7, 8, 0) Print Join(a, ",") For i = 0 To UBound(a) For j = i + 1 To UBound(a) If a(j)tmp = a(j) a(j) = a(i) a(i) = tmp End If Next Next Print Join(a, ",") End Sub

石阡县19488739904: VB怎样把数字按从大到小排列??急求!!! -
归蚀盐酸: 利用排序算法呀.假设有100个10000以内的随机数存放在a数组中.冒泡法:for i=1 to 100 a(i)=int(rnd*10000) next for i=1 to 99 for j=i+1 to 100 if a(i)<a(j) then temp=a(i) a(i)=a(j) a(j)=temp end if next next for i=1 to 100 print a(i) next 选择法:for i=...

石阡县19488739904: .三个数从大到小排序用VB代码的做法 -
归蚀盐酸: for i=1 to i<3{if a[i]>a[i+1] then{t=a[i];a[i]=a[i+1];a[i+1]=t;}end if} if a[1]>a[2} then ?a[3]>a[1]>a[2] else ?a[3]>a[2]>a[1]

石阡县19488739904: VB排序算法,要求在界面上显示包括原始数据(如以十个数据为例),排序过程以及排序后数据. -
归蚀盐酸: private sub form_click() dim temp as integer dim a(1 to 10) as integer for i=1 to 10 a(i)=inputbox("请输入") next i for i=10 to 2 step -1 for j=1 to i -1 if a(j)>a(j+1) then temp=a(j+1) a(j+1)=a(j) a(j)=temp end if next j next i print "经过冒泡排序,得出结果如下:" fir i=1 to 10 print a(i) next i end sub 不解释 ,你自己参透一下

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网