Быстрое возведение в степень BigDecimal
Реализую алгоритм "слева направо" (Алгоритмы быстрого возведения в степень)
public class BigAlgebra {
BigDecimal fastPow(BigDecimal num, int pow) {
if (pow == 0) return BigDecimal.valueOf(1.); //проверка нулевой степени
String BYNPOW = Integer.toString(pow, 2); //представление степени двоичным числом
BigDecimal res = BigDecimal.valueOf(0); //инициализация результата НУЛЕМ
for (int i = BYNPOW.length() - 1; i <= 0; i++) { //цикл перебора от СТАРШЕГО бита к МЛАДШЕМУ
if (BYNPOW[i] == 1) { //TODO
res = res.multiply(res).multiply(num);
} else res = res.multiply(res);
}
return res;
}
public static void main(String[] args) {
BigAlgebra cadabra = new BigAlgebra();
System.out.println(cadabra.fastPow(BigDecimal.valueOf(3), 5));
}
}
Выдаёт ошибку: Error:(7, 17) java: array required, but java.lang.String found. Подскажите как в контексте заменить матричное обращение к строке ?
Ответы (1 шт):
Конкретно по вашей ошибке:
к символу в строке нельзя обратиться по индексу в квадратных скобках, как к элементу массива. К тому же, символ строки нужно сравнивать с символом '1', а не с числом 1. Поэтому вместо
if (BYNPOW[i] == 1) {
должно быть
if (BYNPOW.charAt(i) == '1') {
После этого исправления код компилируется и запускается: https://ideone.com/irAPK4
Еще одна проблема: по логике ваш код должен проходить с конца строки до ее начала, но цикл прерывается на первой же итерации, т.к. исходное значение i заведомо не проходит условие цикла i <= 0. Цикл должен быть таким:
for (int i = BYNPOW.length() - 1; i >= 0; i--) {
Т.е. идти от последнего символа, пока индекс больше или равен нулю, на каждом шаге индекс уменьшать на 1.