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

Java 修改解决方案以使用单个循环,java,math,nested-loops,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

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

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个循环时,我也很挣扎。但是一个循环?我不知道如何改进我的代码。请帮帮我。

这是一个数学问题

如果知道可以找到从
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;
    }
}
有这样的结果

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在评论中指出了此公式的名称:)有关更多信息,欢迎您查看

对整个范围进行循环迭代,并使用索引来决定是否添加、重置或打印您的总和

希望这能给你正确的想法,如果你还不知道的话,我可以再解释一下。

这应该可以做到:

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 totalSum=0;
int batchSum=0;

对于(int i=1;i我发现了一个使用java8流的很好的解决方案:

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);
});


只需一些数学运算,就可以找到从1到X的和,不需要循环,
X*(X+1)/2
就可以了;)谢谢你给我们展示了你自己的一些作品,而不是只提交了讲师给你的问题。我们在这里不太常见:)@AxeIH你能用一个吗,我被迫使用一个循环。您的输出是否应该与下面给出的一样?@Shahrair Nazim Real yesAleIH您能使用一个循环吗,我被迫使用一个循环。@NkosieMaphumulo这里是正确的和专业的,但我认为这不是OP的正确解决方案。在我看来,这个练习旨在教授循环和变量管理的推理。如果这是真的,这个答案完全没有抓住要点。@MargaretBloom使用一个循环,比如OP ask,对于变量管理,使用一个临时变量来存储之前的总和是有效的。算法应该被认为是有效的,那么为什么它不好呢?不久前,我被要求打印历元值的日期(没有日期实例;)。这是用简单的数学(模和除法找出每一步)在10行内完成的,大多数学生使用循环和开关用巨大的代码来完成。老师很高兴找到了逻辑。我同意你的观点,我一点也不批评你的答案:)但作为一名老师,我会要求学生在不利用三角数特性的情况下再次完成这项任务。我希望他们能够掌握循环,而不是让我费尽心思去寻找一个无法用基础数学简化的练习:)谢谢。:)谢谢,很高兴。希望这是可以理解的。它不应该是top+1而不是top-1吗?@AxelH这不是你的解决方案。这只是一个数学公式。当然,在看到你的答案后,我意识到这是可以解决的。但是,我不知道你也在计划实施。所以,我自己去做是为了帮助OP。没有必要投否决票。无论如何,我已经删除了它,因为从技术上讲,你是第一个指出数学方法的人。但一定要使用一个运行总计(lastTotalSum)。@AxelH我回滚了更改,因为我觉得保留这样一个低效的方法是不对的。恩科西,请接受阿克塞尔的回答。那将是正确的做法。原创性的想法!这里有很多循环(隐藏在array.stream中)。如果你可以在一个流中完成这项工作,这会更好:)仍然有2个循环(如果你像这样打印,则为3个)。是的,即使它不是OP要求的单个循环,我还是想发布它,因为我认为这是一个很好的解决方案。感谢您指出这一点。我花时间研究了使用java8 Streams的“仅一个循环”解决方案,这个解决方案好吗?:)确实如此,streams解决方案至少需要2个循环,正如您在前面的评论中所说的。我之所以使用数组,是因为如果我声明一个简单的
int
变量,就会出现编译错误,这个问题已经出现了。无论如何,声明性方法不适合这里,也不适合java8流。程序方法(如您的解决方案)更适合于此类问题。
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;

}
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);
});