Exponenciación por cuadratura (obteniendo el número de multiplicaciones)

Estoy haciendo una tarea donde tengo que hacer dos cosas usando la exponenciación al cuadrar . Una es obtener el número de multiplicaciones y la otra es obtener el resultado real.

Aquí hay algunos ejemplos:

2
11

Debe salida

2048
5

porque 2^11 = 2(2((2)²)²)²

Estoy haciendo esto sin recurrencia y obtengo el resultado correcto, pero el número de multiplicaciones es incorrecto. Si ingreso 2^6estoy obteniendo 3multiplicaciones y eso está bien, pero si ingreso 2^8estoy obteniendo 4multiplicaciones y esto está mal.

¿Me puede señalar lo que estoy haciendo mal al involucrar las multiplicaciones correctas?

Aquí está el código:

public static void main(String[] args) {
    double x, result = 1;
    int n, multiplications = 0;
    DecimalFormat df = new DecimalFormat("#.00");
    Scanner readLine = new Scanner(System.in);

    x = readLine.nextDouble();
    n = readLine.nextInt();

    if (n == 1) {
        multiplications++;
        System.out.print(df.format(x) + "\n" + multiplications + "\n");
    } else if (n == 2) {
        x *= x;
        multiplications++;
        System.out.print(df.format(x) + "\n" + multiplications + "\n");
    } else {
        while (n > 0) {
            if (n % 2 == 0) {
                multiplications++;
            } else {
                multiplications++;
                result *= x;
                n--;
            }
            x *= x;
            n /= 2;
        }
        System.out.print(df.format(result) + "\n" + multiplications + "\n");
    }
}
Respuesta 1

Si n % 2 == 0, no multiplicas; solo cuadras. así que déjalo multiplications++.

Luego por 2 ^ 8 obtienes:

n  |  n % 2  |  multiplications
----------------------
8  |  0      |  0
4  |  0      |  0
2  |  0      |  0
1  |  1      |  1

Y 1 multiplicación debe ser correcta. Ya que2^8 = (((1² * 2)²)²)²

Si quieres contar la cuadratura como una multiplicación, debes hacer

... else
    multiplications = multiplications + 2

Y luego reste 2 para la cuadratura inicial y la multiplicación.

Entonces, en general:

while (n > 0) {       
    if(n % 2 == 1) {
        multiplications++;
        result *= x;
        n--;
    }
    multiplications++;
    x *= x; // shouldn't that be result *= result?
    n /= 2;
}
multiplications -= 2;
Respuesta: 2

¿Alguien puede explicarme cómo configurar correctamente el HUB del servidor Selenium para IP y PUERTO específicos? Encontré este Bind selenium a una IP específica - ¿Posible? pero no estoy seguro de cuál es la IP correcta ya que ...

Estoy ejecutando una aplicación web Tomcat en modo de depuración y, mirando a través de los objetos más grandes con YourKit profiler, veo que, con mucho, el más grande es una sola instancia de com.lmax.disruptor.RingBuffer. ...

No sé cómo funcionan estas clases. Estoy tratando de saber qué cámaras hay disponibles. Además, si es posible, me gustaría cambiar la configuración de la cámara (creo que puedo resolverlo por mí mismo, pero un ...

Obtengo mis datos del servidor y tengo que actualizarlos cada x segundos. Hago esto usando la función postDelayed del controlador. mInterval largo privado = 10000; Runnable mStatusChecker = new Runnable () {...