Проверка кода на корректность. Необходимо посчитать сумму целых чисел в этом диапазоне Java

Есть диапазон чисел 1...n где n - целое число, может быть как положительным, так и отрицательным. Необходимо посчитать сумму целых чисел в этом диапазоне.

Вот моё решение (я в процессе изучения):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String[] args) throws IOException {

        BufferedReader vr = new BufferedReader(new InputStreamReader(System.in));
        int counter = 0;
        byte input = Byte.parseByte(vr.readLine());

        if (input > 0) {
            for (int i = 0; i <= input; i++) {
                counter += i;
            }
        } else {
            for (int j = input; j != 1; j++) {
                counter += j;
            }
            counter += 1;
        }
        System.out.println(counter);
    }
}

Но сайт, на котором я решаю задачи почему то отказывается принимать мой код. Вопрос: кто виноват?


Ответы (1 шт):

Автор решения: Nowhere Man
  1. Для чтения данных следует использовать Scanner: int n = new Scanner(System.in).nextInt();
  2. Можно обойтись одним циклом, у которого следует корректно определить начальное и конечное значения:
int sum = 0;
for (int i = Math.min(1, n), m = Math.max(1, n); i <= m; i++) {
    sum += i;
}

Аналогично, вместо цикла можно воспользоваться Stream API:

int sum2 = IntStream.rangeClosed(Math.min(1, n), Math.max(1, n)).sum();
  1. В идеале следует воспользоваться формулой суммы членов арифметической прогрессии, тогда время решения будет постоянным и не будет расти пропорционально величине n как в предыдущем пункте:
int from = Math.min(1, n);
int to = Math.max(1, n);
int sum3 = (from + to) * (to - from + 1) / 2;

Для "защиты" от целочисленного переполнения можно сначала выполнить деление на 2, а потом умножение, определив чётный множитель:

int sum4 = (from + to) % 2 == 0 ? (from + to) / 2 * (to - from + 1) : (to - from + 1) / 2 * (from + to);
→ Ссылка