|
|

楼主 |
发表于 2016-10-22 22:49
|
显示全部楼层
本帖最后由 天山草 于 2016-10-22 22:51 编辑
用 VB 写的程序,供参考。
'有四种颜色的珠子足够多,穿成六个一串的珠子串。不分首尾,有几种方法?
'等价问题:由 1,2,3,4 构成的六位数有多少个?最小的数是 111111,最大的是444444。如果此数倒转(左一位变个位,左二位变十位,等等),
'都不等于另一个六位数,共有多少个不同的六位数?
'编程思路:最小的数是 111111,最大的数是 444444. 从 111111 开始按四进制依次加 1,一直加到444444为止,共有4096个数字。
'上述 4096 个数字中,有不符合要求的,例如 111112 与 211111,必须去掉一个,这样总的方法数就比 4096 少许多。
运行结果: 2080
下面是正式程序——
Private Sub form_Click()
Dim a$(4096), b$(4096), aa$(4096)
k = 0
mi = "111110"
For i = 1 To 4096 '从 111111 按四进制逐次加 1,加 4096 次,最后得到 444444 为止。
mi = mi + 1
If Mid(mi, 6, 1) = 5 Then Mid(mi, 6, 1) = 1: Mid(mi, 5, 1) = Mid(mi, 5, 1) + 1
If Mid(mi, 5, 1) = 5 Then Mid(mi, 5, 1) = 1: Mid(mi, 4, 1) = Mid(mi, 4, 1) + 1
If Mid(mi, 4, 1) = 5 Then Mid(mi, 4, 1) = 1: Mid(mi, 3, 1) = Mid(mi, 3, 1) + 1
If Mid(mi, 3, 1) = 5 Then Mid(mi, 3, 1) = 1: Mid(mi, 2, 1) = Mid(mi, 2, 1) + 1
If Mid(mi, 2, 1) = 5 Then Mid(mi, 2, 1) = 1: Mid(mi, 1, 1) = Mid(mi, 1, 1) + 1
k = k + 1
a(k) = Trim(mi) '这 4096 个数字存放在 a 数组中,以字串方式存放。
aa(k) = a(k) '此后 a 数组中的数字会变化,备份一个到 aa 数组。
Next i
n = 0
For k = 1 To 4096 '形成另一个 b 数组,它是 a 数组的“倒置”。
b(k) = Trim(Mid(a(k), 6, 1) + Mid(a(k), 5, 1) + Mid(a(k), 4, 1) + Mid(a(k), 3, 1) + Mid(a(k), 2, 1) + Mid(a(k), 1, 1))
Print #1, k; "---"; a(k); "---"; b(k)
Next k
For k = 1 To 4096 '通过 a 与 b 的对照,将 a 中重复的数作上标记(重复的数换成 0)
For j = k + 1 To 4096
If b(k) = a(j) Then a(j) = 0
Next j
Next k
n = 0
For k = 1 To 4096 '把 a 中重复的数筛选掉
If a(k) = 0 Then GoTo 10
n = n + 1
Print n; "---"; a(k)
10: Next k
End Sub
运行结果——
1 ---111111
2 ---111112
3 ---111113
4 ---111114
5 ---111121
6 ---111122
7 ---111123
8 ---111124
9 ---111131
10 ---111132
11 ---111133
12 ---111134
13 ---111141
14 ---111142
15 ---111143
16 ---111144
17 ---111211
18 ---111212
19 ---111213
20 ---111214
21 ---111221
22 ---111222
23 ---111223
24 ---111224
25 ---111231
26 ---111232
27 ---111233
28 ---111234
29 ---111241
30 ---111242
31 ---111243
32 ---111244
33 ---111311
34 ---111312
35 ---111313
36 ---111314
37 ---111321
38 ---111322
39 ---111323
40 ---111324
..............................
2067 ---434244
2068 ---434344
2069 ---434434
2070 ---434444
2071 ---441144
2072 ---441244
2073 ---441344
2074 ---441444
2075 ---442244
2076 ---442344
2077 ---442444
2078 ---443344
2079 ---443444
2080 ---444444
----------------------------- |
|