使用 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.
我想将内部求和简化为 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循环递增sum
j次,相当于下面一行:
sum = sum + j
请注意,当 j
是 i
的倍数时,条件 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。
这是正确答案
我无法弄清楚如何将这段代码简化为求和,因为它有一个 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.
我想将内部求和简化为 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循环递增sum
j次,相当于下面一行:
sum = sum + j
请注意,当 j
是 i
的倍数时,条件 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。
这是正确答案