Индекс массива за пределами проекта Задача Эйлера 17 - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время я застрял в проблеме 17 в Project Euler.Немного предыстории: моя программа отлично работает для чисел 1–120. Как только я получаю более 120, она не использует оператор по модулю так, как я планировал.Я пытаюсь это исправить, но для предыдущих итераций этой проблемы функции деления и остатка работают правильно, поэтому я пытаюсь выяснить, что изменилось, что вызывает ошибку в условном (I> = 120 && I <1000) (Ps, не волнует оптимизация, я студент-программист и просто работаю над созданием и освоением массивов).спасибо! </p>

Я пытался использовать свои операторы деления и остатка в разное время, например, s + = единицы [деление (I)] в условном выражении (I> = 120 && I <1000) и неисправил ошибку. </p>

public class LetterCount {

    public static void main(String[] args) {
        int i;
        String[] ones = {"","one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten","eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", ""};
        String[] tens = {"", "","twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety", ""};
        String[] hundreds = {"","onehundred", "twohundred", "threehundred", "fourhundred", "fivehundred", "sixhunded", "sevenhundred", "eighthundred", "ninehundred"};
        String[] thousand = {"", "onethousand"};
         String s  = new String();
         for(i = 0; i <= 126; i++) {
             if(i <= 20) {
                 s+= ones[i];
             }
             if(i == 20) {
                 //performs i / 10
                 s+= tens[division(i)];
             }
             if(i > 20 && i < 100) {
                 //performs i / 10 & i % 10
                 s+= tens[division(i)];
                 s+= ones[remainder(i)];
             } if (i == 100) {
                 //performs i / 100
                 s+= hundreds[division(i)];
             } if (i > 100 && i < 120) {
                 //performs i / 10, i % 10, and i / 100
                 s+= hundreds[division(i)];
                 s+= tens[division(i)];
                 s+= ones[remainder(i)];

             } if (i >= 120 && i < 1000) {
                 //performs i / 100, i / 10, and i % 10
                s+= hundreds[division(i)];
                s+= tens[division(i)];
                s+= ones[remainder(i)];


             } if (i == 1000) {
                 s+= thousand[division(i)];
             }
         }
         System.out.println(s);
    }

    public static int remainder(int i) {
        if (i >= 100 && i <= 1000) {
            return i % 100;
        } else if(i > 10 && i < 100) {
            return i % 10;
        }
        return i;
    }
    public static int division(int i) {
        if (i == 1000) {
        return i / 1000;
        } 
        if (i >= 100 && i <= 1000) {
            return i / 100;
        } if (i < 100)  {
            return i / 10;
        }
        return i;
    }
}

1 Ответ

1 голос
/ 11 апреля 2019

Ваш ones массив длина = 21
Таким образом, последний элемент, к которому вы можете получить доступ, будет ones[20]
Но в вашей функции remainder(int i) вы можете возвращать значения до 99
Потому что ваш метод содержит эту строку return i % 100;
Поэтому, когда вы будете использовать ones[remainder(i)];
Вы столкнетесь с Array Index Out of Bounds обычно , если возвращенное значение напоминания> 20

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...