Быстрое возведение в степень 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 шт):

Автор решения: insolor

Конкретно по вашей ошибке: к символу в строке нельзя обратиться по индексу в квадратных скобках, как к элементу массива. К тому же, символ строки нужно сравнивать с символом '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.

→ Ссылка