Получение неверного вывода с использованием arraylists

Задача состоит в том, чтобы найти число, отдельные цифры которого умножаются на последовательно увеличивающуюся мощность и складываются, равные начальному числу.

Например: взять 89, разделить его на 8 и 9, затем 8^1 + 9^2 = 89

static List<Integer> sumDigPow(int a, int b) { 
        List<Integer> eureka = new ArrayList<Integer>(0);
        List<String> digits = new ArrayList<String>();
        String num;
        int sum = 0, multi;

    for (int i=a; i<=b; i++) {
        num = String.valueOf(i);
        digits.add(num);

        for (int j=0; j<digits.size(); j++) {
                multi = (int)Math.pow(Integer.parseInt(digits.get(j)), j+1);
                sum += multi;
        }

        if (sum == i) eureka.add(i);

        sum = 0;
        digits.clear();
    }

    return eureka;
}

При вводе 1 и 100 (диапазон) вывод должен быть [1, 2, 3, 4, 5, 6, 7, 8, 9, 89], но я получаю все числа [1, 2... 100].

Я начал изучать Java довольно недавно и не могу найти проблему в коде. Любые советы будут с благодарностью.

Ответ 1

Вы можете использовать следующее:

static List<Integer> sumDigPow(int a, int b) {
    List<Integer> eureka = new ArrayList<Integer>(0);
    String num;
    int sum = 0, multi;

    for (int i = a; i <= b; i++) {
        num = String.valueOf(i);
        for (int j = 0; j < num.length(); j++) {
            multi = (int) Math.pow(Character.getNumericValue(num.charAt(j)), j + 1);
            sum += multi;
        }

        if (sum == i) {
            eureka.add(i);
        }
        sum = 0;
    }
    return eureka;
}

Объяснение:

  1. Вы не проверяли вторую цифру номера.
  2. Обведите все символы строки num.
  3. Нет нужды в массиве digits, вы можете просто использовать числовое значение символа.

Ответ 2

Используйте char[] чтобы разбить числа на цифры в виде массива символов (вы просто добавляете в список целое число одной строкой, а не отдельные цифры):

...
    char[] digits;
...
    digits = String.valueOf(i).toCharArray();

Затем, если вы вычли '0' из каждой цифры char вы автоматически получите фактическое значение int цифры, не Integer.parseInt метод Integer.parseInt для String или любой другой метод синтаксического анализа:

    (int)Math.pow(digits[j] - '0', j + 1);

Полный код будет выглядеть так:

static List<Integer> sumDigPow(int a, int b) {
    List<Integer> eureka = new ArrayList<Integer>();
    int sum = 0;
    char[] digits;

    for (int i = a; i <= b; i++) {
        digits = String.valueOf(i).toCharArray();
        for (int j = 0; j < num.length(); j++) 
            sum += (int)Math.pow(digits[j] - '0', j + 1);

        if (sum == i) eureka.add(i);
        sum = 0;
    }
    return eureka;
}

Ответ 3

Проблема была в этих строках:

num = String.valueOf(i);
digits.add(num);

Вы не разбили свой номер на цифры. Вы просто помещали свои целые числа в список digits. Посмотрите на этот код:

static List<Integer> sumDigPow(int a, int b) {
        List<Integer> eureka = new ArrayList<Integer>();
        List<String> digits;
        String num;
        int sum = 0, multi;

        for (int i = a; i <= b; i++) {
            num = String.valueOf(i);
            digits = Arrays.asList(num.split(""));

            for (int j = 0; j < digits.size(); j++) {
                multi = (int) Math.pow(Integer.parseInt(digits.get(j)), j + 1);
                sum += multi;
            }

            if (sum == i) eureka.add(i);

            sum = 0;
        }

        return eureka;
    }

Я просто разделил ваш номер строки на цифры, используя Arrays.asList(num.split("")). Выводит для a=1, b=100 список:

1
2
3
4
5
6
7
8
9
89