因此,对于作业,我们必须计算一段代码中的步数。这是:
int sum = 0;
for (int i = 1; i <= n*n; i++)
for (int j = 1; j <= i; j++)
for (int k = 1; k <= 6; k++)
sum++;
我的教授(我认为)解释说,第二行中的操作数量可以使用求和符号找到,如下所示:
n^2
Σ x 4 + 3
i=1
这将是1/2(n ^ 4 + n ^ 2)x 4 + 3 = 2n ^ 4 + 2n ^ 2 + 3
但是从我看来,我认为它会像4n ^ 4 + 2(我的教授说4n ^ 4 + 3,我不知道第三次操作在哪里......)
我在这里做错误符号吗?对于我来说,对嵌套for循环进行求和表示法是有道理的,但我不知道为什么它本身可以用于for循环。
感谢。
答案 0 :(得分:8)
实际上即使你的教授结果也是错误的。确切的结果是3n^4+3n^2
。
要获得该结果,只需考虑:
所有段落都非常简单(如果你考虑第一个n
自然数之和的公式,那么从第4步到第5步的过程是立竿见影的。
答案 1 :(得分:1)
我猜你和你的教授都错了。根据我的计算(我可能也错了)它应该是 3n^4+3n^2
。
最外面的循环将运行n ^ 2次。考虑到这一点,内部循环将在第一次迭代中运行1次,依此类推直到n^2
。即来自j=1 to j=1,2,3,4 ... n^2
。如果我们对系列(1+2+3...n^2)
求和,则会变为(n^2(n^2+1))/2
。
因此,对于外部循环的n ^ 2次迭代,内部循环将执行(n^2(n^2+1))/2
次。对于第二个循环的每次迭代,最内部循环执行六次。因此,只需将(n^2(n^2+1))/2
与6相乘,即可评估为 3n^4+3n^2
。
要查看答案,我们举个例子。说n=5
,运行你的算法并输出这将给1950年的总和。现在在评估的表达式中替换这个值,这将类似3(5^4)+3(5^2)
,并再次评估为1950
。
答案 2 :(得分:-1)
您需要计算的是:
S = sum(i in 1..n^2) sum(j in 1..i) sum(k in 1..6) 1
现在,最里面的总和显然是6,因此我们有
S = sum(i in 1..n^2) sum(j in 1..i) 6
= 6 sum(i in 1..n^2) sum(j in 1..i) 1
最里面的总和只是前i个数字的总和,你应该知道它是i(i + 1)/2
,给出
S = 6 sum(i in 1..n^2) i(i + 1)/2
= 3 sum(i in 1..n^2) i(i + 1)
= 3 sum(i in 1..n^2) (i^2 + i)
我们可以将其分为两个部分:
S = 3 [ (sum(i in 1..n^2) i^2) + (sum(i in 1..n^2) i) ]
第二个数字只是我们的老朋友,第一个n ^ 2数字的总和,所以扩展很容易。
第一个总和有一个新朋友,第一个n ^ 2个方格的总和。如果您手边不知道,可以谷歌。
放入公式,展开一点,用扫帚整理,你应该得到答案。
干杯!