2012-04-07 2 views
2

Я выполняю задачу математики для эйлера проекта, и я столкнулся с какой-то странной проблемой при запуске программы. Результат должен быть суммой всех нечетных чисел до 10 000 000, но я получаю отрицательное число, что я делаю неправильно?Java - Добавить все странные нечетные числа

package program; 

import java.util.*; 

public class MainClass { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

    int total = 0; 

    for (int counter = 1; counter < 10000000; counter++) { 
     if (!((counter % 2) == 0)) { 
      total+=counter; 
     } 

    } 
    System.out.println(total); 

} 

}

+2

Просто оптимизационной вещь, вы можете увеличивать счетчик на 2 вместо одного. Это позволяет получить все нечетные числа без оператора if. 'counter + = 2' –

+1

Кроме того, просто'! (x == 0) '- чрезвычайно странный способ написать' x! = 0'. – Voo

ответ

7

Используйте long вместо int. Вы получаете отрицательное число из-за переполнения целых чисел.

5

Переменная не может содержать итог, потому что сумма слишком велика. В какой-то момент в цикле вы получаете integer overflow, и он «перевернулся» на отрицательное число:

Вам нужен long.

вопрос стиля и эффективности, я бы изменить код для итерации по 2, так что вам не нужно тест на нечетность:

public static void main(String[] args) { 
    long total = 0; 
    for (int counter = 1; counter < 10000000; counter += 2) { // iterate by 2 
     total += counter; 
    } 
    System.out.println(total); 
} 
+1

Хорошо, если мы пытаемся оптимизировать это, мы можем просто выбросить весь цикл и использовать ole gauss;) – Voo

2

Вы должны использовать long total = 0; вместо int total = 0;int в Java 4 байта и колеблется от -2,147,483,648 до 2,147,483,647.

так 2,147,483,647 + 1 = -2,147,483,648

total для этого цикла выходит быть 25.000.000.000.000, которые могут быть размещены на long

2

Просто бросить в более умное решение этой проблемы (МАТЕМАТИКА! Яй).

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

В любом случае это означает, что сумма от 1..X равна: ((X + 1)/2)**2

Смежные вопросы