Проверка кода на корректность. Необходимо посчитать сумму целых чисел в этом диапазоне 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
→ Ссылка
- Для чтения данных следует использовать
Scanner:int n = new Scanner(System.in).nextInt(); - Можно обойтись одним циклом, у которого следует корректно определить начальное и конечное значения:
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();
- В идеале следует воспользоваться формулой суммы членов арифметической прогрессии, тогда время решения будет постоянным и не будет расти пропорционально величине
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);