间隔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程序,请回答下列问题。
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