考虑以下伪代码。要执行的乘法总数是多少?
D = 2
for i = 1 to n do
for j = i to n do
for k = j + 1 to n do
D = D * 3
(A) 3 个连续整数的乘积的一半。
(B)三个连续整数的乘积的三分之一。
(C) 3 个连续整数的乘积的六分之一。
(D)以上都不是。答案: (C)
解释:语句“D = D * 3”被执行了 n*(n+1)*(n-1)/6 次。让我们看看如何。
对于 i = 1,乘法语句执行 (n-1) + (n-2) + .. 2 + 1 次。
对于 i = 2,语句执行 (n-2) + (n-3) + .. 2 + 1 次
………………………………
…………………………
对于 i = n-1,语句执行一次。
对于 i = n,该语句根本不执行
所以总的来说,语句是在以下时间执行的
[(n-1) + (n-2) + .. 2 + 1] + [(n-2) + (n-3) + .. 2 + 1] + … + 1 + 0
上面的系列可以写成
S = [n*(n-1)/2 + (n-1)*(n-2)/2 + ….. + 1]
上述级数的和可以通过从标准级数中减去级数得到 S1 = n2 + (n-1)2 + .. 12. 这个标准级数的和是 n*(n+1)*(2n+ 1)/6
S1 – 2S = n + (n-1) + … 1 = n*(n+1)/2
2S = n*(n+1)*(2n+1)/6 – n*(n+1)/2
S = n*(n+1)*(n-1)/6
上面的解决方案依赖于获得系列总和的技巧,但有一种更直接的方法可以获得相同的结果:
对于 i = 1,乘法语句执行 (n-1) + (n-2) + .. 2 + 1 次。
对于 i = 2,语句执行 (n-2) + (n-3) + .. 2 + 1 次
因此,对于每个 i,语句执行的次数为:
这是从 1 到 n – i 的 n 个自然数的总和。因此,可以简化为:
相乘,我们将得到以下结果:
现在,这是为每个 i 执行语句的次数。因此,总共执行该语句的次数为:
暂时忽略一半。扩大总和很简单。您可以将其分布在整个表达式中以获取:
使用n个自然数的和和n个自然数的平方和的公式,我们得到:
进一步简化并以 n/6 作为通用术语将为您提供:
现在,取2作为常用项,用它来抵消我们之前忽略的一半。这给你:
最后,使用2 -b 2 ,您会得到所需的答案:
这应该使您现在清楚解决方案!
这个问题的测验