Нужна помощь в расчете 1 + 2 + 3 + 4 ... + n? - PullRequest
3 голосов
/ 19 марта 2020

Итак, мне поручили написать программу, которая спрашивает номер (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);
    }
}

Ответы [ 3 ]

3 голосов
/ 19 марта 2020

Вам нужно дифференцировать

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

Но проще было бы использовать a для l oop, это более логично

int n = Integer.parseInt(reader.nextLine());
for (int i = 0; i <= n; i++) {
    addition += i;
}
1 голос
/ 19 марта 2020

Используя более современное решение, вы можете использовать что-то вроде этого:

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, это просто фиксированное значение, но Я уверен, что вы поняли идею. Вы можете спросить, почему мне нравится решение по сравнению с более традиционным для l oop, просто из-за его малости и краткости, я просто нахожу, что его гораздо легче читать и поддерживать.

Не Отметим, что подобное решение знакомит вас с некоторыми понятиями, связанными с функциональным программированием, такими как неизменяемость. Хотя ребята вроде Eri c Elliott могут сделать много уроков по JavaScript, принципы можно перенести практически на любой язык! :)

Немного теории

Хотя функциональное программирование рушится, точный пример, который я привел, может быть не самым подходящим, если ваша основная цель - производительность . В этом случае лучше использовать более традиционное решение, но, учитывая, что это такое примитивное приложение / фрагмент кода, я думаю, что это нормально.

С точки зрения сложности вычислений, с точки зрения скорости и ветвления, это примерно то же самое, что и традиционное решение, однако , просто с помощью потока, не говоря уже о создании диапазона, вероятно, используя больше памяти, чем просто для l oop. Но вы могли бы также утверждать, что компилятор проделал бы такую ​​большую работу, что он мог бы фактически реализовать это как традиционную для l oop.

С моим решением, оно выполняет 9 итераций, если вы будете использовать для l oop как тот, который предоставил @azro, то код даст 10 итераций, так что об этом тоже стоит подумать. Угадай! :)


Edit

Следует отметить, что это решение будет работать с Java 8 +.

0 голосов
/ 19 марта 2020

Вам нужно две переменные, одна для суммы, а другая для текущего числа, которое будет добавлено:

    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...