|
' 一条手串由七颗珠子穿成。每颗珠子上刻有一个数字。数字总和为 43。其中一个珠子上的数字是 1。各颗珠子上的数字集合记为{A1}={1,……}。
' 相邻两颗珠子上的数字和记为集合{A2},相邻三颗珠子上的数字和记为集合{A3},以此类推。全部七颗珠子上的数字和记为集合{A7}={43}。
' 若{A}={A1}+{A2}+{A3}+{A4}+{A5}+{A6}+{A7}={1,2,3,4,5,…,42,43},求每颗珠子上的数字是什么。
' 从刻有 1 的珠子开始,逆时针向转一周,设这七颗珠子上的数字依次是 1,x,y,z,u,v,t。
' x,y,z,u,v,t 的解集 {x},{y},{z},{u},{v},{t}都应小于{2,…,m}。那么 m 是多少呢?
' x、y、z、u、v、t 的和是 43-1 = 42,这六个数中必有一个是 2,所以其余五个的和是 42-2 = 40。那么这五个数中的最大者可能
' 大到多少呢?假定五个中的最大者其值有可能达到 m,则 3+4+5+6+m=40,因此 m 最大也不会超过 40-3-4-5-6=22。
' 下面用穷举法寻求 x、y、z、u、v、t 的值。
Private Sub form_Click()
Open "七颗珠子.txt" For Output As #1
Dim a(43)
n = 43
m = 22
s = 0
For x = 2 To m
For y = 2 To m
For z = 2 To m
For u = 2 To m
For v = 2 To m
t = 43 - 1 - x - y - z - u - v
a(1) = 1: a(2) = x: a(3) = y: a(4) = z: a(5) = u: a(6) = v: a(7) = t
a(8) = 1 + x: a(9) = x + y: a(10) = y + z: a(11) = z + u: a(12) = u + v: a(13) = v + t: a(14) = t + 1
a(15) = 1 + x + y: a(16) = x + y + z: a(17) = y + z + u: a(18) = z + u + v: a(19) = u + v + t:
a(20) = v + t + 1: a(21) = t + 1 + x
a(22) = 1 + x + y + z: a(23) = x + y + z + u: a(24) = y + z + u + v: a(25) = z + u + v + t:
a(26) = u + v + t + 1: a(27) = v + t + 1 + x: a(28) = t + 1 + x + y
a(29) = n - 1 - x: a(30) = n - x - y: a(31) = n - y - z: a(32) = n - z - u: a(33) = n - u - v:
a(34) = n - v - t: a(35) = n - t - 1
a(36) = n - 1: a(37) = n - x: a(38) = n - y: a(39) = n - z: a(40) = n - u: a(41) = n - v: a(42) = n - t
a(43) = n
For i = 1 To n - 1 '从小到大排序
Min = i
For j = i + 1 To n
If a(j) < a(Min) Then Min = j
Next j
t = a(i)
a(i) = a(Min)
a(Min) = t
Next i '排序结束
For i = 1 To n - 1 '寻找符合要求的排序,即结果为{1,2,3,…,43}的排序。
If a(i) <= 0 Then GoTo 111 ' 小于等于零,舍弃。
If a(i) = a(i + 1) Then GoTo 111 '相邻者数字相同,舍弃
Next i
If a(43) = a(1) Then GoTo 111 '首尾数字相同,舍弃
s = s + 1 ' 符合条件的有一个,计数器加一。
Print x, y, z, u, v, t '显示符合条件的解
Print #1, x, y, z, u, v, t
111: Next v
Next u
Next z
Next y
Next x
Print "s="; s: Print #1, "s="; s
Print " 无解!": Print #1, " 无解!"
Close
End Sub
程序运行 5 分钟,给出下面的结果:
s = 0
无解!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|