Получение неверного вывода с использованием 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;
}
Объяснение:
- Вы не проверяли вторую цифру номера.
- Обведите все символы строки
num
. - Нет нужды в массиве
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