在某次实弹射击训练中,班长将十个战士围成一圈发子弹。首先,班长给第一个战士10颗,第二个战士2颗,第三个战士8颗,第四个战士22颗,第五个战士16颗,第六个战士4颗,第七个战士10颗,第八个战士6颗,第九个战士14颗,第十个战士20颗。然后按如下方法将每个战士手中的子弹进行调整:所有的战士检查自己手中的子弹数,如果子弹数为奇数,则向班长再要一颗。然后每个战士再同时将自己手中的子弹分一半给下一个战士(第10 个战士将手中的子弹分一半给第1个战士)。问需要多少次调整后,每个战士手中的子弹数都相等?每人各有多少颗子弹?
要求:
1、快速输出调整次数,以及最后战士手中的子弹数
2、按照客户要求输出第几轮调整后,各战士手中的子弹数
客户输入格式有:
a.查询某轮次调整后各战士手中的子弹数
X
b.查询某几轮次调整后各战士手中的子弹数
X1,X2,X3,..,Xn
c.查询连续几轮的情况
Xa-Xb
d.综合b、c的复合型查询
X1,Xa-Xb,...,Xn
要求结果的输出格式为:
0   10   2   8  22  16   4  10   6  14  20  各战士手中原始的子弹数
1   xx  xx  xx  xx  xx  xx  xx  xx  xx  xx  第1轮各战士手中的子弹数
2   xx  xx  xx  xx  xx  xx  xx  xx  xx  xx  第2轮各战士手中的子弹数
    ……
n   xx  xx  xx  xx  xx  xx  xx  xx  xx  xx  最后一轮各战士手中的子弹数(应相等) 求助用VB编写该程序。。完成要求1和2

解决方案 »

  1.   

    Dim i As Integer
    Dim j As Integer
    a0 = Array(0, 10, 2, 8, 22, 16, 4, 10, 6, 14, 20)
    a1 = a0
    Do Until a1(1) = a1(2) And a1(2) = a1(3) And a1(3) = a1(4) And a1(4) = a1(5) And a1(5) = a1(6) And a1(6) = a1(7) And a1(7) = a1(8) And a1(8) = a1(9) And a1(9) = a1(10)
       For i = 1 To 10
       If a1(i) Mod 2 = 1 Then
          a1(i) = a1(i) + 1
       End If
        Next i
       a0 = a1
       For j = 2 To 10
         a1(j) = a1(j) + a0(j - 1) / 2
       Next j
         a1(1) = a1(1) + a0(10) / 2
         
         a1(0) = a1(0) + 1
         
       a0 = a1
    Loop
    感觉算法没问题,怎么老是溢出。
    明天再研究。
      

  2.   

    好了,第一步我帮你算出来了,总共需要调整17次,最后战士手中的子弹数为18。
    Private Sub Command1_Click()
    Dim i As Integer
    Dim j As Integer
    a0 = Array(0, 10, 2, 8, 22, 16, 4, 10, 6, 14, 20)
    a1 = a0
    Do Until a1(1) = a1(2) And a1(2) = a1(3) And a1(3) = a1(4) And a1(4) = a1(5) And a1(5) = a1(6) And a1(6) = a1(7) And a1(7) = a1(8) And a1(8) = a1(9) And a1(9) = a1(10)
       a1 = a0
       For i = 1 To 10
       If a1(i) Mod 2 = 1 Then
          a1(i) = a1(i) + 1
       End If
        Next i
       a0 = a1
       For j = 2 To 10
         a1(j) = a1(j) / 2 + a0(j - 1) / 2
       Next j
         a1(1) = a1(1) / 2 + a0(10) / 2
         
         a1(0) = a1(0) + 1
         
       a0 = a1
    Loop
    For i = 0 To 10
    Text1.Text = Text1.Text & "," & a1(i)
    Next i
    Text1.Text = Right(Text1.Text, Len(Text1) - 1)
    End Sub
    昨天晚上忘了每个战士手上的还减了一半,结果不对。
    至于第N轮调整后,每个战士手中的子弹数,你只要将循环条件改一下就行了,
    如果还有问题的话在提出来。