¿Hablamos de "doblar" o de "potenciar"?
Doblar sería multiplicar x2 varias veces un valor.
Potenciar es multiplicar un valor por sí mismo, varias veces.
Lo que vimos en la fórmula del interés compuesto, era una potencia
((1.0 + tasa/100)^31)
Es decir, ese valor no se dobla 31 veces. Si no que se multiplica por sí mismo, 31 veces
valor * valor * valor * valor * valor * valor ........ así 31 veces
En una potencia, tenemos una base (valor inicial) y un exponente (las x veces que la base se multiplica por ella misma.
Así que para hacerlo con un bucle, lo que haremos dentro del bucle será multiplicar la base por sí misma tantas veces como diga el exponente.
Esto sería un ejemplo completo escrito en Java.
El proceso de potenciar se hace en una función escrita separada del programa principal, el cuál lo único que hace es pedir base y exponente para luego mostrar el resultado.
import java.util.Scanner;
public class Potencia {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Indique valor: ");
int valor = teclado.nextInt();
System.out.print("Indique exponente: ");
int exponente = teclado.nextInt();
System.out.println("\nResultado de la potencia: " + potenciar(valor, exponente));
teclado.close();
}
/*
* Función que recibe una base y un exponente
* y realiza la potencia mediante un bucle.
*/
public static int potenciar(int base, int exp) {
int valorPotenciado = base;
for (int i = 1; i < exp; i++)
valorPotenciado = valorPotenciado * base;
return valorPotenciado;
}
}
Ese código puedes probarlo online en
esta URLEstá escrito en Java, pero el proceso sería el mismo para cualquier lenguaje.
Lo único que hay que tener en cuenta son las limitaciones de los tipos de datos.
Ese ejemplo lo he escrito para trabajar con enteros (int), lo cuál sirve para potencias pequeñas.
Indique valor: 4
Indique exponente: 5
Resultado de la potencia: 1024
Pero una potencia de exponente grande, como puede ser 31, puede dar resultados enormes que sobrepasan las capacidades del tipo de dato int, así que nos dará resultados que no son válidos, incluso incongruentes:
Indique valor: 4
Indique exponente: 31
Resultado de la potencia: 0
Así que habría que escoger otros tipos de datos con capacidades más amplias.
Para tipos de datos primitivos, tenemos el double, pero incluso este puede no ser suficiente.
Nos dará resultados válidos y correctos, pero usando notación científica para las cifras muy grandes, y puede que no sea esto lo que queramos:
Indique valor: 4
Indique exponente: 31
Resultado de la potencia: 4.6116860184273879E18
Si queremos seguir trabajando con valores enteros, en Java tenemos la clase
BigInteger, que al ser una clase y no un tipo primitivo, hay que modificar la sintaxis del código para operar con él.
import java.math.BigInteger;
import java.util.Scanner;
public class Potencia {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Indique valor: ");
BigInteger valor = new BigInteger(teclado.nextLine());
System.out.print("Indique exponente: ");
int exponente = teclado.nextInt();
System.out.println("\nResultado de la potencia: " + potenciar(valor, exponente));
teclado.close();
}
/*
* Función que recibe una base y un exponente
* y realiza la potencia mediante un bucle.
*/
public static BigInteger potenciar(BigInteger base, int exp) {
BigInteger valorPotenciado = base;
for (int i = 1; i < exp; i++)
valorPotenciado = valorPotenciado.multiply(base);
return valorPotenciado;
}
}
Ahora sí podemos hacer potencias grandes:
Indique valor: 4
Indique exponente: 31
Resultado de la potencia: 4611686018427387904
Si quisiéramos, lo mismo, pero trabajando con números reales (más apropiado para cálculos financieros) en lugar de enteros, tenemos la clase
BigDecimalPero bueno, esto ya es en lo que respecta a Java. Cada lenguaje tendrá sus tipos de datos, sus clases y sus limitaciones propias.
Al margen de esto, la lógica a aplicar para hacer una potencia mediante un bucle, es la misma para cualquier lenguaje:
public static int potenciar(int base, int exp) {
int valorPotenciado = base;
for (int i = 1; i < exp; i++)
valorPotenciado = valorPotenciado * base;
return valorPotenciado;
}