使用if语句简化循环的求和

时间:2015-03-01 02:22:19

标签: algorithm computer-science discrete-mathematics

我无法弄清楚如何将此代码简化为摘要,因为它中包含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。

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,但它只会发生,我次。我觉得这很简单,我没有看到明显的联系。

5 个答案:

答案 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。

这是正确答案