我无法搞清楚如何来简化这个代码来求和,因为它有它的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,但它只是发生了,我的时间。 我觉得这是很简单的,我没有看到明显的联系。
这是我提出的解决方案:
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)
for (k = 1 to j) {
sum++
}
需要注意的是上面的for循环递增sum
进行j次,这相当于如下行:
sum = sum + j
需要注意的是条件if (j % i ==0)
计算结果为true
时j
是一个多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
}
}
注意:为了简单起见,我已经改变的起始索引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;
我认为这是最接近你有什么,但如果是下面没有一个办法。
sum = 0
for (i = 1 to n)
for (j = 1 to i)
for (k = 1 to i*j)
sum++
基本上,你改变Ĵ,这样的循环,而不是高于一切,从1到i ^ 2,然后跳过任何没有我的多,你就必须在数倍j循环。
在其他的答案已经指出,对于这笔款项,不需要任何循环更为有效的表达。
我标记为正确的答案是错的。 这是给了我答案。 我会尽我所能,正确说出来。
总和的从j = 1到i的平方为偶数j的总和从i = 1到n,等于大约所述总和从i = 1到n i的平方乘以我的平方加上一个遍布2。
(或再次最后部分)等于大约是:
的总和从i = 1到n个(I ^ 2 * [(I ^ 2)+ 1])/ 2,其是西塔Ñ^ 5。
这是正确的答案