我设法解决了这个问题,下面是我的解决方案:
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();
}
}
现在我被告知要修改我的解决方案,以便它只使用一个循环。 我在上面的代码中有3个循环,即使我尝试只使用2个循环,我也在努力。但是一圈?我不知道如何改进我的代码。请帮帮我。
答案 0 :(得分:12)
这是Mathematic
问题。
如果您知道可以找到1
到X
的所有整数之和,则只需X * (X+1) / 2
。
您可以轻松找到所有批次值。
Sum from 1 to 400: 80200
Sum from 401 to 450: 21275
Sum from 1 to 450: 101475
会像这样找到:
450 * 451 / 2 = 101475 (1 to 450)
400 * 401 / 2 = 80200 (1 to 400)
101475 - 80200 = 21275 (401 to 450)
有了这个,你可以通过递增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;
}
}
我用
运行它public static void main(String[] args){
sum(500, 50);
}
获得此结果
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
使用此解决方案的好处是循环次数,这将增加q
而不是1
注意:解决方案是一种快速实施,可以做得更好。
编辑:
感谢评论中的 Margaret Bloom 指出此公式的名称:)欲了解更多信息,欢迎您查看Triangular Number
答案 1 :(得分:7)
这应该这样做:
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;
}
}
修改强>: 更好的数学方式:
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;
}
答案 2 :(得分:2)
我找到了一个很好的java8 Streams解决方案:
int n=1000;
int q=50;
int length = n/q -1;
int[] previousSum={0};
IntStream.range(0, length).map(i -> (i+1)*q).forEach(s -> {
int sum=(s*(s+1))/2;
int batch = sum - previousSum[0];
previousSum[0] = sum;
System.out.println("Sum from " + (s - q + 1) + " to " + s + ":" + batch);
System.out.println("Sum from 1 to " + s + ":" + sum);
});
答案 3 :(得分:1)
执行一个循环迭代整个范围并使用索引来决定是否添加,重置或打印您的总和。
希望这给出了你正确的想法,如果你还不知道我可以多说一点。