考虑下面的伪代码。要执行的乘法运算总数是多少?
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) 3个连续整数的乘积的三分之一。
(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 ,您将获得所需的答案:
现在应该可以使您清楚地知道解决方案了!
这个问题的测验