修改解决方案以使用单个循环

Nko*_*ulo 12 java math nested-loops

我设法解决了这个问题,下面是我的解决方案:

public class ProblemA001k {

public static void main(String[] args) {



        System.out.println("Sum from 1" + " to " + divQ + ":" + sum2);
        System.out.println();
        divQ += q;
        newQ += q;
        sum1 = 0;
        sum2 = 0;
        }

key.close();
}
Run Code Online (Sandbox Code Playgroud)

}

现在我被告知要修改我的解决方案,以便它只使用一个循环.我在上面的代码中有3个循环,即使我尝试只使用2个循环,我也在努力.但是一圈?我不知道如何改进我的代码.请帮我.

Axe*_*elH 11

这是一个Mathematic问题.

如果你知道你可以找到所有整数的总和1X,你只需要做X * (X+1) / 2.

您可以轻松找到所有批次值.

Sum from 1 to 400: 80200
Sum from 401 to 450: 21275
Sum from 1 to 450: 101475
Run Code Online (Sandbox Code Playgroud)

会发现这样的:

450 * 451 / 2 = 101475 (1 to 450)
400 * 401 / 2 = 80200  (1 to 400)
101475 - 80200 = 21275 (401 to 450)
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以限制环路距离计算值q,以n通过增加q

并快速编写代码:

static void sum(int n, int q){
    int i = q;
    int sum, tmp=0;
    while(i < n){
        sum = i * (i+1) / 2;
        System.out.println(String.format("Sum from %d to %d : %d", i-q+1 , i, sum - tmp));
        System.out.println(String.format("Sum from %d to %d : %d", 1, i, sum));
        tmp = sum;
        i += q;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我用它来运行它

public static void main(String[] args){
    sum(500, 50);
}
Run Code Online (Sandbox Code Playgroud)

得到这个结果

Sum from 1 to 50 : 1275
Sum from 1 to 50 : 1275
Sum from 51 to 100 : 3775
Sum from 1 to 100 : 5050
Sum from 101 to 150 : 6275
Sum from 1 to 150 : 11325
Sum from 151 to 200 : 8775
Sum from 1 to 200 : 20100
Sum from 201 to 250 : 11275
Sum from 1 to 250 : 31375
Sum from 251 to 300 : 13775
Sum from 1 to 300 : 45150
Sum from 301 to 350 : 16275
Sum from 1 to 350 : 61425
Sum from 351 to 400 : 18775
Sum from 1 to 400 : 80200
Sum from 401 to 450 : 21275
Sum from 1 to 450 : 101475
Run Code Online (Sandbox Code Playgroud)

使用此解决方案的好处是循环次数,这将增加q而不是1

注意:解决方案是一个快速实现,这可以做得更好.

编辑:

感谢Margaret Bloom在评论中指出这个公式的名称:)欲了解更多信息,欢迎您查看Triangular Number


Bij*_*ung 6

这应该这样做:

int totalSum = 0;
int batchSum = 0;

for (int i = 1; i <= n; i++) {
    totalSum += i;
    batchSum += i;
    if (i % q == 0) {
        System.out.println("Sum from " + (i - q + 1) + " to " + i + ":" + batchSum);
        System.out.println("Sum from 1 to " + i + ":" + totalSum);
        batchSum = 0;
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑:更好的数学方式:

int lastTotalSum = 0;
for (int i = 1; i <= n / q; i++ ) {
    int top = i * q;
    int totalSum = top * (top + 1) / 2;
    int batchSum = totalSum - lastTotalSum;
    System.out.println("Sum from " + (top - q + 1) + " to " + top + ":" + batchSum);
    System.out.println("Sum from 1 to " + top + ":" + totalSum);
    lastTotalSum = totalSum;

}
Run Code Online (Sandbox Code Playgroud)