我无法弄清楚如何将此代码简化为摘要,因为它中包含if语句。
sum=0
for (i = 1 to n ){
for (j = 1 to i^2){
if (j % i ==0) then
for (k = 1 to j){
sum++
}
}
}
}
我知道if语句将在每个循环中执行i次。
1%1 = 0
2%2 = 0
4%2 = 0
3%3 = 0
6%3 = 0
9%3 = 0
等等。
这是我到目前为止(见下面的链接),原谅i ^ 2表示法,我无法发布没有代表的图像。再次,内部求和是i ^ 2而不是2选择i。
我想将内部求和简化为j,但它只会发生,我次。我觉得这很简单,我没有看到明显的联系。
答案 0 :(得分:1)
这是我提出的解决方案:
sum=0
for (i = 1 to n )
{
for (j = i to i^2, step=i){
sum = sum + j
}
}
<强>更新强> 它看起来像square pyramidal number,所以你可以写:
sum = (2*n^3 + 3*n^2 + n / 6)
答案 1 :(得分:0)
for (k = 1 to j) {
sum++
}
请注意,上面的for循环增加sum
次j次,相当于以下行:
sum = sum + j
请注意,当if (j % i ==0)
是true
的倍数时,条件j
评估为i
,因此您实际上可以更改由{{1}索引的for循环在每次迭代后增加j
而不是i
。所以你可以改为使用以下等效代码:
1
注意:为简单起见,我已将sum = 0
for (i = 1; i <= n; i++) {
for (j = 0; j <= i^2; j = j + i) {
sum = sum + j
}
}
的起始索引更改为j
而非0
。如果我们从1
开始,1
将取值j
而不是1 + i, 1 + 2i, ...
的倍数。
答案 2 :(得分:0)
快速解决方案:
int sum = n * (n + 1) / 2;
sum *= sum;
sum += n * (n + 1) * (2 * n + 1) / 6;
sum /= 2;
正在做什么代码:
int sum = 0, i, j;
for(i = 1; i <= n; i++)
for(j = 1; j <= i; j++)
sum += i * j;
答案 3 :(得分:0)
我认为最接近你所拥有但没有if的方法如下。
sum = 0
for (i = 1 to n)
for (j = 1 to i)
for (k = 1 to i*j)
sum++
基本上,你改变j使得不是循环遍历从1到i ^ 2的所有东西,然后跳过不是i的倍数的任何东西,你只需要在多次循环上进行j循环。
正如其他答案所述,这个总和有更高效的表达式,不需要任何循环。
答案 4 :(得分:0)
我标记为正确的答案是错误的。这是给我的答案。我会尽力说出来。
对于偶数j,从j = 1到i的平方的i = 1到n之和大约等于从i = 1到n的i平方乘以i平方加上一个满2.的总和。 / p>
(或最后一部分)大约等于:
从i = 1到n的总和(i ^ 2 * [(i ^ 2)+ 1])/ 2 这是Theta n ^ 5。
这是正确答案