火柴游戏:有n根火柴,第1次取1根,第2次取2根,第i次取i根,当剩余火柴数为0时,不用添加火柴(即k=0),游戏结束。如果剩余火柴数不为0,但不够下一次取,此时添加k(k≥1)根火柴,在剩余火柴中再从1根开始取,直到能取完为止,求k的最小值。
例如:n=3时,第1次取1根,第2次取2根,此时正好取完,无须添加火柴,k=0;
例如:n=8时,第1次取1根,第2次取2根,第3次取3根,第4次要取4根,但剩余2根不够取。则加上1根,剩余3根,再从1根开始取,即第4次取1根,第5次取2根,剩余火柴为0,游戏结束,得k=1。
又如:n=4时,第1次取1根,第2次取2根,第3次不够取,若加上1根,剩余2根,再从1根开始取,第3次取1根,剩余1根不够第4次取,再加1根,又是剩余2根,显然加1根永远不可能取完。所以改用每次加2根,第1次取1根,第2次取2根,第3次不够取,添加2根,第3次取1根,第4次取2根,恰好能取完,得k=2。
编写一个VB程序可实现上述功能:在文本框Text1中输入火柴数量,单击“计算”按钮,在文本框Text2中显示最少添加数量,程序运行界面如下图所示:
实现上述功能的程序代码如下:
Private Sub ok_Click()
Dim a(1 To 100) As Boolean, n As Integer, k As Integer, i As Integer
n = Val(Text1.Text)
For i = 1 To 100
a(i) = False
Next i
a(n) = True
Do While n <> 0
i = 1
Do While i <= n
①
i = i + 1
Loop
If n = 0 Then
Text2.Text = Str(k)
Else
If k = 0 Then k = 1
n = n + k
If ② Then
k = k + 1
n = Val(Text1.Text)
Else
a(n) = True
End If
End If
Loop
End Sub