【问题标题】:Need help in calculation 1+2+3+4...+n?在计算 1+2+3+4...+n 时需要帮助?
【发布时间】:2020-03-19 11:16:05
【问题描述】:

所以我被分配编写一个程序,它询问一个数字 (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);
    }
}

【问题讨论】:

  • 为什么addition 本身和 1 都递增?你实际上是在写addition = 2 * addition + 1;
  • 对于这种原始级别的问题,我建议人们尝试用铅笔和纸模拟他们的程序(如果他们似乎无法使用调试器)。似乎用户在询问之前几乎没有尝试解决问题。

标签: java addition calculation


【解决方案1】:

你需要区分

  • 总结一切的additition
  • 一个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;
}

【讨论】:

    【解决方案2】:

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

    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 做很多教程,但这些原理几乎可以转移到任何语言! :)

    一点理论

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

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

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


    编辑

    我应该注意,此解决方案适用于 Java 8+。

    【讨论】:

    • 感谢您抽出宝贵时间回答我这样一个惯用的问题!但由于我只熟悉 Java 4 个小时,现在这已经过时了(:D),但为了将来的目的,一定会记住您的评论!
    • @pakkis26 我认为情况就是这样,因此我决定加入一点理论,而不是太多,以免让你大吃一惊。如果您需要帮助学习,请随时给我留言! :)
    • @pakkis26 lambda expressions 之类的可能也值得研究。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 2019-11-07
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多