2015-03-09 2 views
0

Здравствуйте, я новичок в программировании, и я пытаюсь написать небольшую программу, где он рассчитает сумму для первых N чисел. Проблема в том, что это не работает для четных чисел. Мне не удалось понять, почему. Мой код выглядит следующим образом:Содержит первые N номеров в java

int n = Integer.parseInt(args[0]); 
    int sum = (1+n)/2*n; 
    System.out.println(sum + " is the sum of first " + n + " numbers"); 
+0

@RohitJain На самом деле это дает 8 при п = 4, что неверно. – Eran

ответ

2

Это не работает для четных п, потому что (n+1)/2 усекается до междунар.

Это означает, что если, например, n=4, (n+1)/2 результаты в 2 вместо 2,5, так что, когда вы умножаете его на п, вы получите 8 вместо желанной 10.

Вы можете решить эту проблему, просто изменяя порядок операций. Если вы сначала умножите n на (n + 1), результат гарантированно будет четным, поэтому его разделение на 2 даст правильный ответ.

int sum = n*(1+n)/2; 
1

У вас есть целочисленное деление с (1+n)/2. Если ваш номер четный, то (1+n) нечетно, а деление на 2 усечет любой десятичный результат, так что int, деленный на int, по-прежнему int.

Умножьте по n сначала, затем разделите на 2. Это гарантирует, что продукт еще до деления, поэтому результат правильный.

int sum = (1+n) * n/2; 
1

Можно использовать ((n * (n + 1))/2). Но я думаю, что следующий будет работать без ошибок переполнения в течение нескольких дополнительных значений n:

if ((n & 1) == 0) { 
    sum = ((n >> 1) * (n + 1)); 
} else { 
    sum = (n * ((n + 1) >> 1)); 
} 
Смежные вопросы