简化了从循环求和与if statment(Simplifying Summation from lo

2019-10-22 03:36发布

我无法搞清楚如何来简化这个代码来求和,因为它有它的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语句将执行我次,每次循环。

1%1 = 0
2%2 = 0
4%2 = 0
3%3 = 0
6%3 = 0
9%3 = 0

等等。

这是我迄今为止(见下面的链接),原谅我^ 2的符号,我还不能代表没有发表图片。 再次,内求和为i ^ 2 2不选择我。

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

Answer 1:

这是我提出的解决方案:

sum=0
for (i = 1 to n )
{
  for (j = i to i^2, step=i){
    sum = sum + j
  }
}

更新它看起来像四角锥数 ,所以你可以这样写:

sum = (2*n^3 + 3*n^2 + n / 6)


Answer 2:

for (k = 1 to j) {
    sum++
}

需要注意的是上面的for循环递增sum进行j次,这相当于如下行:

sum = sum + j

需要注意的是条件if (j % i ==0)计算结果为truej是一个多i ,这样你就可以真正改变你的for循环的索引j被递增i ,而不是1每次迭代之后。 所以,你可以有以下等效代码来代替:

sum = 0
for (i = 1; i <= n; i++) {
    for (j = 0; j <= i^2; j = j + i) {
        sum = sum + j
    }
}

注意:为了简单起见,我已经改变的起始索引j0而不是1 。 如果我们从开始1j将值1 + i, 1 + 2i, ...代替的倍数i



Answer 3:

快速的解决方案:

  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;


Answer 4:

我认为这是最接近你有什么,但如果是下面没有一个办法。

sum = 0
for (i = 1 to n)
  for (j = 1 to i)
    for (k = 1 to i*j)
      sum++

基本上,你改变Ĵ,这样的循环,而不是高于一切,从1到i ^ 2,然后跳过任何没有我的多,你就必须在数倍j循环。

在其他的答案已经指出,对于这笔款项,不需要任何循环更为有效的表达。



Answer 5:

我标记为正确的答案是错的。 这是给了我答案。 我会尽我所能,正确说出来。

总和的从j = 1到i的平方为偶数j的总和从i = 1到n,等于大约所述总和从i = 1到n i的平方乘以我的平方加上一个遍布2。

(或再次最后部分)等于大约是:

的总和从i = 1到n个(I ^ 2 * [(I ^ 2)+ 1])/ 2,其是西塔Ñ^ 5。

这是正确的答案



文章来源: Simplifying Summation from loop with an if statment