使用 if 语句简化 Summation for 循环

Simplifying Summation from loop with an if statment

我无法弄清楚如何将这段代码简化为求和,因为它有一个 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

等等。

这是我目前所拥有的(见下面的 link),请原谅 i^2 符号,我还不能 post 没有代表的图像。同样,内部求和是 i^2 而不是 2 choose i.

http://www.HostMath.com/Show.aspx?Code=%5Csum%5Climits_%7Bi%3D1%7D%5En%5Csum%5Climits_%7Bj%3D1%7D%5Ei%5E%7B2%7D%20%5Csum%5Climits_%7Bk%3D1%7D%5Ej%0A(1)

我想将内部求和简化为 j,但它只发生了 i 次。我觉得这很简单,我没有看到明显的联系。

这是我提出的解决方案:

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)
for (k = 1 to j) {
    sum++
}

注意上面的for循环递增sumj次,相当于下面一行:

sum = sum + j

请注意,当 ji 的倍数时,条件 if (j % i ==0) 的计算结果为 true,因此您实际上可以更改由 [= 索引的 for 循环16=] 在每次迭代后增加 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, ... 而不是 i.

的倍数

快速解决方案:

  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;

我认为最接近您现有但没有 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 遍历倍数即可。

正如其他答案中所述,这个总和有更有效的表达式,不需要任何循环。

我标记为正确的答案是错误的。这是给我的答案。我会尽力把它说好。

从i=1到n的总和,从j=1到i的总和的偶数j的平方约等于从i=1到n的总和i的平方乘以i的平方加一大于2 .

(或最后一部分)大约等于:

从 i =1 到 n 的总和 (i^2 * [(i^2) + 1]) / 2 这是 Theta n^5。

这是正确答案