Advertisement
TeRackSito

Iterativa VS Cursiva

Nov 6th, 2023
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.94 KB | None | 0 0
  1. import java.math.BigInteger;
  2. import java.util.Scanner;
  3. import java.lang.StackOverflowError;
  4.  
  5. /*
  6.  * Autor: Stoyanov Angel Krasimirov
  7.  */
  8.  
  9. public class Main {
  10.     public static void main(String[] args) {
  11.         Scanner sc = new Scanner(System.in);        
  12.        
  13.         double a = askNumber(sc, "Introduce la base");
  14.         int n = askNumber(sc);
  15.  
  16.        
  17.  
  18.         try {
  19.             System.out.printf("El resultado es: %d", potenciaIterativa(a, n));
  20.         } catch (StackOverflowError e) {
  21.             System.out.println("Se ha producido un desbordamiento de pila.");
  22.         }
  23.     }
  24.  
  25.     /**
  26.      * Pregunta al usuario un número con la pregunta indicada y lo devuelve.
  27.      * @param sc
  28.      * @param message
  29.      * @return Devuelve un double.
  30.      */
  31.     private static double askNumber(Scanner sc, String message) {
  32.         System.out.printf("%s: ", message);
  33.  
  34.         try {
  35.             return Double.parseDouble(sc.nextLine().replace(',', '.'));
  36.  
  37.         } catch (NumberFormatException e) {
  38.             System.out.println("El número no es válido.");
  39.             return askNumber(sc, message);
  40.         }
  41.     }
  42.  
  43.     /**
  44.      * Pregunta al usuario un número y lo devuelve.
  45.      * @param sc
  46.      * @return Devuelve un int.
  47.      */
  48.     private static int askNumber(Scanner sc) {
  49.         System.out.printf("Introduce la potencia: ");
  50.  
  51.         try {
  52.             int number = Integer.parseInt(sc.nextLine());
  53.  
  54.             if (number < 0) {
  55.                 System.out.println("El número no puede ser negativo.");
  56.                 return askNumber(sc);
  57.             }
  58.             return number;
  59.         } catch (NumberFormatException e) {
  60.             System.out.println("El número no es válido.");
  61.             return askNumber(sc);
  62.         }
  63.     }
  64.  
  65.     /**
  66.      * Calcula la potencia de un número de forma iterativa.
  67.      * @param a
  68.      * @param n
  69.      * @return Devuelve un BigInteger de precisión arbitraria.
  70.      */
  71.     private static BigInteger potenciaIterativa (double a, int n) {
  72.         BigInteger result = BigInteger.valueOf((long) a);
  73.  
  74.         System.out.println();
  75.  
  76.         for (int i = 1; i < n; i++) {
  77.             result = result.multiply(BigInteger.valueOf((long) a));
  78.  
  79.             if (i%1000 == 0) {
  80.                 double progress = i/ (double) n*100;
  81.                 System.out.printf("\r%s\r[%s%s] - %.2f", " ".repeat(150) , "#".repeat((int) progress), "-".repeat(100- (int) progress), progress);
  82.             }
  83.         }
  84.         System.out.println();
  85.  
  86.         return result;
  87.     }
  88.    
  89.     /**
  90.      * Calcula la potencia de un número de forma recursiva.
  91.      * @param a
  92.      * @param n
  93.      * @return Devuelve un BigInteger de precisión arbitraria.
  94.      */
  95.     private static BigInteger potenciaRecursiva (double a, int n) {
  96.         if (n == 0) {
  97.             return BigInteger.valueOf(1);
  98.         }
  99.         return BigInteger.valueOf((long) a).multiply(potenciaRecursiva(a, n-1));
  100.     }
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement