2014-12-22 4 views
0

Я пытаюсь создать небольшую программу на Java.Amazon Mosquitos - ArrayIndexOutOfBounds

Программа имеет вход 3 типа: S: стартовые комары, K: количество детей, каждый москит, и N: количество дней, которые мы «исследуем».

Каждый москит в Амазонке живет 1 день. День 0, мы начинаем с S комаров. В один прекрасный день, когда живет каждый комар, он делает только две вещи. Во-первых, он атакует одного человека. Сразу после нападения комара рождает комаров K, а затем умирает.

Результатом программы должно быть количество людей, которые будут атакованы в конце N дней.

Например, для входов (1,2,12) выход должен быть 8191 (1 + 2 + 4 + 8 + ... + 4096).

Моя попытка следующее:

public class AmazMosq { 

    public static int reproduction(int starting, int children, int days) { 

     int[] mosquitos = new int[days]; 
     mosquitos[0] = starting; 

     int bites = starting; 

     for (int i = 1; i <= days; i++) { 
      mosquitos[i] = mosquitos[i-1] * children; 

      bites += mosquitos[i]; 
     } 

     return bites; 

    } 


    public static void main(String[] args) { 

     System.out.println("Enter the number of starting mosquitos:"); 
     int starting = IOUtil.readInt(); 

     System.out.println("Enter the number of children each mosquito makes everyday:"); 
     int children = IOUtil.readInt(); 

     System.out.println("Enter the number of days:"); 
     int days = IOUtil.readInt(); 

     System.out.println(reproduction(starting, children, days)); 

    } 

} 

Где IOUtil.readInt() является функцией для чтения входных Ints.

Однако, я получаю эту ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12 
    at AmazMosq.reproduction(AmazMosq.java:11) 
    at AmazMosq.main(AmazMosq.java:34) 

Что это значит и что я сделал не так? Спасибо!

+0

документация Javadoc обычно помогает в понимании того, какие исключения имели в виду: http://docs.oracle.com/javase/7/docs/api/java/lang/ArrayIndexOutOfBoundsException.html – jalynn2

ответ

2

Здесь:

for (int i = 1; i <= days; i++) { 

Вы инициализировать массив как это:

int[] mosquitos = new int[days]; 

Таким образом, вы можете получить доступ к элементам между 0 и days - 1. Вы получаете доступ к элементу mosquitos[days]for внутри цикла, что является причиной этой проблемы, в частности, здесь:

mosquitos[i] = mosquitos[i-1] * children; 
//^ here^
bites += mosquitos[i]; 
//  ^ here ^

Изменить его

for (int i = 1; i < days; i++) { 

Или еще лучше, это:

for (int i = 1; i < mosquitos.length; i++) { 
+0

Спасибо! Я понял. Однако, чтобы ответ был правильным, я подумал, что моя ошибка заключалась в том, чтобы инициализировать массив, а не в цикле. Длина комаров должна была быть днем ​​+ 1, а не днями. – pavlos55

+0

@ pavlos55 это еще одно решение проблемы. Тем не менее, лучше использовать 'array.length' как верхнюю границу, а не другую переменную. –

0

Вы пытаетесь использовать mosquitos[i], когда i <= days. Поскольку days - длина mosquitos, он выбрасывает ArrayIndexOutOfBoundsException, когда i == days.

// ответил уже ..

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