我只是想知道这样的嵌套循环会运行多少次
int sum = 0;
for(int i = 0; i < total; i++) {
for(int j = i + 1; j < total; j++) {
for(int k = j; k < total; k++) {
sum++;
}
}
}
System.out.println(sum);
我可以轻松地看到sum的输出,但是我希望能够用数学方法计算出sum
的总数为total
的总数。
答案 0 :(得分:1)
它只需要一点编程知识。实际上,运行在后面的逻辑只是计算方面的事情。 假设:
total=10,sum=0
-当我为0时:
那个时间j用1(i + 1)和k初始化。因此k将导致我们执行9次循环,并且随着j的增加,它将导致我们执行sum语句8次,7次,再执行6次直到1次。 (9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45次。)
-当我为1:
那个时间j也用2和k初始化,所以sum语句将执行8次,然后执行7次,然后执行6次直到1。 (8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 36次)。
-当我2时:
同一件事重复发生,但以差数开头,所以这次(7 + 6 + 5 + 4 + 3 + 2 + 1 = 28)
所以最终答案是1 + 3 + 6 + 10 + 15 + 21 + 28 + 36 + 45 = 165。
答案 1 :(得分:1)
中间循环的第一次迭代添加
total-1 + total-2 + ... + 1
总和。
中间循环的第二次迭代添加
total-2 + total - 3 + ... + 1
求和
中间循环的最后一次迭代添加
1
总和。
如果将所有这些条件加在一起,您将得到
(total - 1) * 1 + (total - 2) * 2 + (total - 3) * 3 + ... + 2 * (total - 2) + 1 * (total - 1)
自从我学习数学以来已经有一段时间了,所以我不记得这个表达式是否有一个更简单的公式。
例如,如果总数为10,则得到:
9 * 1 + 8 * 2 + 7 * 3 + 6 * 4 + 5 * 5 + 4 * 6 + 3 * 7 + 2 * 8 + 1 * 9 =
9 + 16 + 21 + 24 + 25 + 24 + 21 + 16 + 9 =
165
答案 2 :(得分:0)
TL; DR
该循环将执行((total ^ 3) - total) / 6
次,因此它将是循环结束时sum
的值。
int sum = 0;
for(int i = 0; i < total; i++) {
for(int j = i + 1; j < total; j++) {
for(int k = j; k < total; k++) {
sum++;
}
}
}
很容易看出外部循环运行了total
次。第二个循环比较棘手
让我们尝试解决这个问题
i = 0
,j
从1..total - 1
运行
i = 1
,j
从2..total - 1
运行
i = 2
,j
从3..total - 1
运行
...
i = total - 2
,j
从total - 1 ..total - 1
运行(仅运行一次)
i = total - 1
,因为循环终止条件为true,所以内部循环不执行。
第三个循环依赖于第二个内部循环-k
从j..total - 1
开始运行
让我们将总数设为6
j
从1..5
运行-> k
运行5次(j = 1
)+ 4次(j = 2
)+ 3次({{1 }})+ 2次(j = 3
)+ 1次(j = 4
)
(为其他人显示缩小版本)
j = 4
哪个
2..5 -> 4+3+2+1
3..5 3+2+1
4..5 2+1
5..5 1
通常
1 + 2 + 3 + 4 + 5+
1 + 2 + 3 + 4 +
1 + 2 + 3 +
1 + 2 +
1
这归结为总和
1 + 2 + 3 + .. n +
1 + 2 + 3 +..n - 1+
1 + 2 + 3 +..n - 2+
1 + 2 + 3 +
1 + 2 +
1
对于n * (n - 1)) / 2
的所有值,范围为n
这可以通过以下方式验证
1 to total
int res = 0;
for (int i = 1; i <= total; i++) {
res += (i * (i - 1))/2;
}
等于您的res
。
从数学上讲,
sum
派生:
参考:
答案 3 :(得分:0)
最外层循环运行“总数”次。
对于每个外部循环,中间循环运行'total-i'次。
即合计*合计+合计*(合计1)+合计*(合计2)....合计* 1
=总数*(total + total-1 + total-2 ... 1)
=总数*(1 + 2 + 3 ....总数)
=总数*(第一个“总”自然数之和)
=总数*(总数*(总数+1)/ 2)
现在最里面的循环也为每个中间循环运行'total-j'次
即 总数*(总数*(总数+1)/ 2)*(总数+(总数-1)+(总数-2).... + 1)
=总数*(总数*(总数+1)/ 2)*(1 + 2 + 3 .... +总数)
=总数*(总数*(总数+1)/ 2)*(第一个“总数”自然数之和)
=总数*(总数*(总数+1)/ 2)*(总数*(总数+1)/ 2)。 所以最后您会得到一些接近的东西
总数*(总数*(总数+1)/ 2)*(总数*(总数+1)/ 2)。
对不起,因为@andreas提到了最里面和中间的循环只运行到total-i-1次,所以进行了更正 在这种情况下,它将是第一个(总计1个)编号的总和,应该是(总计1个)*总计2个,因此最终输出应为
total *(total *(total-1)/ 2)*(total *(total-1)/ 2)。
答案 4 :(得分:0)
答案 5 :(得分:0)
我们知道,算术级数的总和是:
最里面的循环将循环
times,它是j
的函数。
您将其总结并获得i
的函数,又称:
您再次对其求和并获得total
的函数,又称:
对于Mathematica个用户,结果是:
f[x_]:=Sum[Sum[x-j,{j,i+1,x-1}],{i,0,x-1}]
在here中,我们可以更清楚地看到它,并且 FINAL 的结果是:
其中x
是total
。
答案 6 :(得分:0)
如果我们运行此循环100次并生成一个数据集,然后对其进行图形处理,则会得到:
现在,此图显然是立方的。因此我们可以使用ax ^ 3 + bx ^ 2 + cx + d的三次方程式进行求解。
使用4点,它们的值均为:
所以完整的等式是
y=x^3/6-x/6
y=x(x^2/6-1/6)
y=(x/6)(x^2-1)
互动图:
<iframe src="https://www.desmos.com/calculator/61whd83djd?embed" width="500px" height="500px" style="border: 1px solid #ccc" frameborder=0></iframe>
答案 7 :(得分:0)
该函数将循环(total/6)*(total*total - 1)
次
下面的代码段只是验证了这一点
var total = 100
var sum = 0;
for(var i = 0; i < total; i++) {
for(var j = i + 1; j < total; j++) {
for(var k = j; k < total; k++) {
sum++;
}
}
}
function calc(n) {
return n*(n-1)*(n+1)/6
}
console.log("sum: "+sum)
console.log("calc: "+calc(total))
答案 8 :(得分:0)
像这样的简单循环:
for (i = a; i < b; i ++) {
....
}
运行b-a
次迭代(i
取值:a
,a+1
,a+2
... b-2
,{{1} }),如果b-1
和a < b
迭代,否则。下面我们将始终假设0
。
可以使用简单的数学公式计算其迭代次数:
我们从最里面的循环开始:
a < b
其迭代次数为:
使用上面的公式,for(int k = j; k < t; k++) {
sum++;
}
的值为U
,这意味着:
(t-1)-j+1
添加中间循环,迭代次数变为:
第二个总和的项是U = t - j
,t-(i+1)
,... t-(i+2)
,t-(t-2)
。
通过解决括号并将它们放在相反的顺序,它们可以写为:
t-(t-1)
,1
,... 2
,t-i-2
。
让t-i-1
。第二个和现在变成:
它是sum of the first t-i-1
natural numbers,其值为:
加上外循环,总和变为:
在最后一个总和上,表达式p = t - j
以(t - i)
开头(当t
时),以i = 0
继续(当t-1
时),并且一直递减直到到达i = 1
(1
为止)。通过替换i = t - 1
,最后一个和为:
最后一个表达式从the sum of the first n
natural numbers中减去the sum of the first n
square numbers。其值为:
现在很容易简化表达式:
已发布代码的迭代次数为: