当前位置: 高中信息技术 / 综合题
  • 1. (2020·杭州模拟) 从前有一只九尾狐叫小九,他拥有超高的智商,喜欢数学推理。最近他喜欢上了利用约瑟夫环玩推理纸牌的游戏。即给定n张环形排列的纸牌,选定最小的一张牌为起始位置。第一次取第1张牌(起始位置的纸牌),第二次间隔1张取第3张纸牌,第三次

    间隔2张取第6张纸牌,……直到取完为止(如果取的位置超过n,重新从1位置取)。如果有4张纸牌,那么取的纸牌编号依次为1,3,4,2。同样,可以知道每张纸牌的被取走的顺序如下表。

    序号

    1

    2

    3

    4

    1

    轮次

    1

    2

    1

    3

    1

    4

    1

    2

    轮次

    2                     2

    2

    4

    2

    3

    轮次

    3

    2

    3

    4

    轮次

    4

    纸牌被取走顺序也可以理解为纸牌存留的轮次。每次取走一张纸牌后,下一轮第一张纸牌编号为该纸牌的后一张。上述例子中3第二个被取,留存轮次2,下一轮的第一张纸牌为4,剩下的纸牌留存轮次增加。

    现在,只要给小九纸牌的数量n,他能通过逆推法快速地计算出取的纸牌编号顺序,方法如下(以n=4为例):

    逆推得到的纸牌顺序

    1

    4

    2

    3

    最终得到的纸牌编号

    1

    2

    3

    4

    即在第i轮,上一轮纸牌轮次加1,并在后面增加一张轮次为1的纸牌。然后将轮次为1放在最前的位置,最后整体循环向右移动n-i次。直到n轮后,可知每张纸牌被取走的顺序,根据此顺序,得到每次取走纸牌的编号。

    轮次

    数组

    1    2    3    4

    1

    a(1)=1

    1

    2

    ①前一轮所有值加1

    ②第二位增加数值1

    ③将轮次为1的数放在最前

    ④整体右移动2位

    2

    2    1

    1    2

    1    2

    3

    ①前一轮所有值加1

    ②第三位增加数值1

    ③将轮次为1的数放在最前

    ④整体右移动1位

    2    3

    2    3    1

    1    2    3

    3    1    2

    4

    ①前一轮所有值加1

    ②第四位增加数值1

    ③将轮次为1的数放在最前

    ④整体右移动0位

    4    2    3

    4    2    3

    1    4    2

    1    4    2

    根据以上算法小九编写了如下VB程序,请回答下列问题。

    1. (1) 由题意可知,当n的值为6时,1~6张纸牌被取走顺序为
    2. (2) 请在划线处填入合适的代码。

      Dim n As Integer

      Dim a(1 To 100) As Integer

      Private Sub Command1_Click()

          Dim i As Integer, j As Integer,k As Integer

          Dim ans As String, x As Integer

          n = Val (Text1. Text)

          a(1) = 1

          For i=2 To n

              For j=1 To i-1

                  

              Next j

              j=i

              Do While j>1

                  a(j)=a(j-1)

                  j=j-1

              Loop

              a(1) = 1

              For j=1 Ton - i

                  k = a(1)

                  

                  a(x) = k

              Next j

          Next i

          ans =“”

          For i=1 Ton

              ans = ans + Str(a(i))

          Next i

          Label1. Caption =“序列为:”+ ans

      End Sub

      Function yd(i As Integer) As Integer

          Dim j As Integer, tmp As Integer

          For j=i To 2 Step -1

              tmp=j+1

              If tmp > i Then

              a (tmp) = a(j)

          Next j

          yd=j+1

      End Function

微信扫码预览、分享更方便