利用vb编程速解--约瑟夫环的问题

2025-10-24 15:35:28

1、打开任意一个EXCEL表格,在上面"开发工具"(若没有,可以在"文件"--"选项"--"自定义功能区"中选择开发工具即可);

    然后打开左上角"visual basic"编辑器

2.打开后,出现如下图,选择"模块" ( 注意在左侧点击鼠标右键,即可增加模块项),开始吧!

利用vb编程速解--约瑟夫环的问题

利用vb编程速解--约瑟夫环的问题

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

利用vb编程速解--约瑟夫环的问题

3、声明变量:

          学生人数    plo

          学生报数    num

          当前学生位置  p

          当前位置学生是否离开(布尔类型)  lv

          逢m出局    m

          剩下的人数  hav

  初始设值:

     pol=5; num=1; p =1; lv(p)=true; m=3; hav=5

利用vb编程速解--约瑟夫环的问题

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时,才会继续报数,否                                                                         '则跳过.

利用vb编程速解--约瑟夫环的问题

6、改变条件:

          学生人数    plo=8

           逢m出局    m=7

结果......如图可见

       (只修改了红圈的内容,6处哦!)

利用vb编程速解--约瑟夫环的问题

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,简单.....

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢