利用vb编程速解--约瑟夫环的问题
1、打开任意一个EXCEL表格,在上面"开发工具"(若没有,可以在"文件"--"选项"--"自定义功能区"中选择开发工具即可);
然后打开左上角"visual basic"编辑器
2.打开后,出现如下图,选择"模块" ( 注意在左侧点击鼠标右键,即可增加模块项),开始吧!


2、问题规则:例如五个人报数,当数到3时那个人出局,接着下一人再报数,一直到最后一个人.

3、声明变量:
学生人数 plo
学生报数 num
当前学生位置 p
当前位置学生是否离开(布尔类型) lv
逢m出局 m
剩下的人数 hav
初始设值:
pol=5; num=1; p =1; lv(p)=true; m=3; hav=5

4、初值完毕后.
使用循环语句for...next 和 do .....loop
(1) For p = pol To 1 Step -1 '循环语句,设置lv()数组5个为true.其他为false
lv(p) = True
Next p
(2) Do While hav> 1'先循环到剩下的人为大于1时停止,
If lv(p) And (c Mod m) = 0 Then '两个条件当前位置为true,并且是3
hav = hav - 1 '执行三个动作 剩下的人减1;此位置人已离开;显 '示到表格A1中出局人序号
lv(p) = False
Sheet1.Range("a1") = Sheet1.Range("a1") &”_”& p
End If
......
loop
上面循环设置了出局的人;然后,再设置学生报数过程.
5、报数设置
If p = pol + 1 Then p = 1 '为什么不是p>pol then p=1 呢?因为这样会使p
'一直为1,可以试一下.
If lv(p) Then num = num Mod m + 1 '只有lv()是true时,才会继续报数,否 '则跳过.

6、改变条件:
学生人数 plo=8
逢m出局 m=7
结果......如图可见
(只修改了红圈的内容,6处哦!)

7、借鉴之用
约瑟夫环的问题:
Sub 约瑟夫()
Dim pol%, num%, hav%, p%,m%
Dim lv(1 To 100) As Boolean
m = 3 ‘逢m出列
pol= 5: num= 1: p = 1 ‘pol个人数, num报数, p当前位置
hav= pol ‘剩下的人数
For p = pol To 1 Step -1
lv(p) = True
Next p
p = 1
Do While hav> 1
If lv(p) And (c Mod m) = 0 Then
hav = hav - 1
lv(p) = False
Sheet1.Range("a1") = Sheet1.Range("a1") &”_”& p
End If
p = p + 1
If p = pol + 1 Then p = 1
If lv(p) Then num = num Mod m + 1
Loop
For p = 1 To pol Step 1
If lv(p) Then Sheet1.Range("b1") = Sheet1.Range("b1") & p
Next
End Sub
不忘记学习,哪怕是我年令大了,哪怕是希望渺小;已坚持半年多,自学了c语言,现感觉学习VB,简单.....