Programming

T04-1D-A02. Número capicúa

Enunciado

Escribe un programa en Java que reciba un número entero y evalúe si es capicúa o no, donde un número capicúa es aquel que se lee igual de principio a fin que de fin a principio

Ejemplo:

  • El número 30303 es capicúa
  • El número 4576754 es capicúa
  • El número 4994 es capicúa

ENTRADA

La entrada comienza con un número indicando cuántos casos de prueba habrá que procesar.

Cada uno de los casos estará formado por una línea con un número N a evalúar si es capicúa o no, donde 0<= N >= 2147483647 (un int) 

SALIDA

Por cada caso de prueba, el programa escribirá CAPICÚA o NO CAPICÚA, según el número cumpla con esta propiedad o no.

RESTRICCIONES

Se resolverá el problema haciendo uso de la siguiente descomposición funcional:

  • Una función que reciba un número entero positivo como argumento y calcule y devuelva la cantidad de cifras que tiene dicho número. La función lanzará la excepción IllegalArgumentException en caso de que el número recibido como argumento sea un número negativo.
  • Una función que reciba un número entero positivo como argumento y devuelva dicho número descompuesto en cifras en un array de enteros, donde cada cifra del número ocupará una posición del array (la cifra más a la izquierda del número, ocupará la posición inicial del array). La función lanzará la excepción IllegalArgumentException si el número pasado como argumento es negativo.
  • Una función que reciba un array de enteros como argumento y evalúe y devuelva si dicho array contiene la misma secuencia de números leída de delante a atrás que de atrás a adelante. 

El programa principal, para cada caso, imprimirá si el número es capicúa o no, e imprimirá el mensaje de error correspondiente si el caso es un número negativo. Para resolver el problema hará uso de las funciones.

OPTIMIZACIÓN ALGORÍTMICA

JuezLTI no lo va a tener en cuenta a la hora de dar como correcto o no el ejercicio, pero vamos a intentar programar de la manera más óptima posible, reduciendo al máximo el uso de memoria y reduciendo al máximo el tiempo de ejecución.

Para ello debes tener en cuenta que puedes resolver el ejercicio SIN crear un array auxiliar (optimizar el uso de memoria) y que puedes resolver el ejercicio sin tener que recorrer el array entero, solo la mitad, en el sentido de que en cuanto el número no sea capicúa no hace falta seguir comprobando, y también en el sentido de que recorriendo solo la mitad del array puedo saber si el número es capicúa (optimizar el uso de tiempo de ejecución). Si diseñas bien tu algoritmo serás capaz de lograr ambas optimizaciones.

Solución


											
package numeroscapicua; import java.util.Scanner; /** * * @author AulaVirtual */ public class NumerosCapicua { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Scanner sc = new Scanner(System.in); int numCasos = 0; int caso = -1; int[] cifras; numCasos = sc.nextInt(); for (int i = 1; i <= numCasos; i++) { caso = sc.nextInt(); try { cifras = descomponerNumero(caso); if (esCapicua(cifras)) { System.out.println("CAPICUA"); } else { System.out.println("NO CAPICUA"); } } catch (IllegalArgumentException ex) { System.out.println("El numero NO puede ser negativo"); } } } public static int cantidadCifras(int numero) { int numCifras = 0; if (numero < 0) { throw new IllegalArgumentException(); } else { while (numero >= 10) { numero = numero / 10; numCifras++; } return numCifras + 1; } } public static int[] descomponerNumero(int numero) throws IllegalArgumentException { int numCifras = cantidadCifras(numero); int[] arrayNumero = new int[numCifras]; for (int i = numCifras - 1; i >= 0; i--) { arrayNumero[i] = numero % 10; numero = numero / 10; } return arrayNumero; } public static boolean esCapicua(int[] numero) { boolean respuesta = true; int i = 0; int j = numero.length - 1; while (i < numero.length && respuesta == true) { if (numero[i] != numero[j]) { respuesta = false; } i++; j--; } return respuesta; } }

Input

10 7 33 282 37073 365563 30098 -676 487212784 3877783 3445433
10 7 33 282 37073 365563 30098 -676 94872127849 3877783 3445433

Output

CAPICUA CAPICUA CAPICUA CAPICUA CAPICUA NO CAPICUA El numero NO puede ser negativo CAPICUA CAPICUA NO CAPICUA
CAPICUA CAPICUA CAPICUA CAPICUA CAPICUA NO CAPICUA El numero NO puede ser negativo