在计算 1+2+3+4...+n 时需要帮助吗?

Need help in calculation 1+2+3+4...+n?

所以我被指派编写一个程序,该程序询问一个数字 (n),然后像这样进行加法运算:1+2+3+4...+n 并打印加法运算

虽然我总是收到错误的数字,但我不知道哪里出了问题?

import java.util.Scanner;

public class LukusarjanSumma {

    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        int addition = 0;
        System.out.println("Where to?");
        int n = Integer.valueOf(reader.nextLine());
        while (addition <= n){
            addition += addition;
            addition ++;
        } System.out.println("Total is " + addition);
    }
}

您需要两个变量,一个用于求和,另一个用于当前要相加的数字:

    Scanner reader = new Scanner(System.in);
    int sum = 0;
    int i = 0;
    System.out.println("Where to?");
    int n = Integer.valueOf(reader.nextLine());
    while (i <= n){
        sum += i;
        i++;
    } System.out.println("Total is " + sum);

你需要区分

  • 总结所有的additition
  • a counter 值增加指数:1,2,3...n

    int addition = 0;
    int counter = 0;
    System.out.println("Where to?");
    int n = Integer.parseInt(reader.nextLine());
    while (counter <= n) {
        addition += counter;
        counter++;
    }
    System.out.println("Total is " + addition);
    

但是使用for循环会更简单,这样更符合逻辑

int n = Integer.parseInt(reader.nextLine());
for (int i = 0; i <= n; i++) {
    addition += i;
}

使用更现代的解决方案,您可以使用类似以下内容的方法:

import java.util.stream.IntStream;

public class Test {

    public static void main(String[] args) {
        int n = Integer.parseInt("10");
        int sum = IntStream.range(0, n).reduce(n, (a, b) -> a  + b);
        System.out.println("Total is " + sum);
    }
}

显然,在我的示例中,它没有从 CLI 获取任何输入,它只是一个固定值,但我相信您明白了。您可能会问为什么我更喜欢解决方案而不是更传统的 for 循环之类的解决方案,纯粹是因为它有多小和简洁,我只是发现它通常更容易阅读和维护。

更不用说像这样的解决方案向您介绍了一些与函数式编程相关的概念,例如不变性。虽然像 Eric Elliott 这样的酷人可能会用 JavaScript 做很多教程,但这些原则几乎可以转移到任何语言! :)

一点理论知识

虽然函数式编程很流行,但如果您的核心目标是性能,我提供的精确示例可能不是最合适的。在这种情况下,使用更传统的解决方案 更好,但考虑到它是如此原始的 application/piece 代码,我认为这很好。

从计算复杂性的角度来看,从速度和分支的角度来看,它与传统解决方案大致相同,但是,只是通过使用流,不要介意创建范围,它可能比简单的 for 循环使用更多的内存。 但是您也可以争辩说编译器会做得非常好,它实际上可以将其实现为传统的 for 循环。

对于我的解决方案,它进行了 9 次迭代,如果您使用 @azro 提供的 for 循环,那么代码将导致 10 次迭代,所以我想这也是需要考虑的事情! :)


编辑

我应该注意到这个解决方案适用于 Java 8+。