对n项(n<=100)数据序列的前x项求和,可设计如下算法:将数据序列存储在数组a中,并按一定规则转换成数组c,再借助数组c实现求和.
将数组a转换成数组c的方法描述如下:
①将数组a中的元素依次存储到数组c中,把当前数组c看作第一层;
②把第一层中的各元素进行如下处理:奇数项值不变,偶数项的值更新为自己与自己前一项的和,将更新后的数组元素看作第二层;
③把第二层中的各元素,按上述方法进行同样操作,更新后的数组元素看作第三层;
④以此类推,直到当前层中仅有一项为止。
例如x=11时,转换过程如图所示:
借助数组c,可快速计算出数组a中前x项的和.例如,数组a中前11项的和,可由表达式c(11)+c(10)+c(8)得到.表达式具体分析过程如下: ②表达式第一项为c(11); ②将下标11转换成二进制数1011,计算该二进制数最右边的“1”所对应的权值,再用11减去此权值得到10,即表达式第二项为c(10); ③按上述方法继续操作,直到计算结果等于0为止。 小龙依据上述方法设计了如下vb程序.请回答下列问题:
(1)
计算数组a中前22项和的表达式为(填写表达式,如c(11)+c(10)+c(8))。
(2)
请在划线处填入合适的代码。
Dim n As
Integer
Dim a(1 To
1000) As Long, c(1 To 1000) As Long
Private Sub
Form_Load()
'读取n个数据,并存储到数组a中(代码略)
End Sub
Private Sub
Command1_Click()
Dim i As
Integer, j As Integer, k As Integer, space As Integer
For i = 1 To n
c(i) = a(i)
Next i
k = 2 '当前层第一个偶数项的位置
space = 1 '当前层偶数项与前一项的间距
Do While k <=
n
For i = k To n
Step k
c(i) = c(i) +
c(i - space)
Next i
k = k * 2
①
Loop
End Sub
Private Sub
Command2_Click()
Dim x As
Integer, sum As Long
x =
Val(Text1.Text): sum = 0
Do While x <>
0
sum = sum +
c(x)
②
Loop
Text2.Text =
Str(sum)
End Sub
Function
lowbit(x As Integer) As Integer
Dim temp As
Integer
temp = x:
lowbit = 1
Do While
③'
lowbit =
lowbit * 2
temp = temp \ 2
Loop
End Function
答案: 【1】c(22)+c(20)+C(16)
【1】space = space * 2【2】x = x- lowbit(x)【3】temp Mod2 = 0