//  DOCUMENTACIÓN  --------------------------------------------------
/*
  ARCHIVO: UE5_A2.java
  EFECTO: Problemas de recorrido en números
  AUTOR: JMB
  GRUPO: 
  FECHA_CREACIÓN: 26/11/2010
  FECHA_ÚLTIMA_MODIFICACIÓN: 17/10/2016
*/

//  USO: UE5_A2 ue52 = new UE5_A2 ()

class UE5_A2
{
  
//  DECLARACIONES DE CONSTANTES  ------------------------------------ 
  
//  DECLARACION DE FUNCIONES  ---------------------------------------

/*
 * FUNCION digitoI (Natural i,n) ---> Natural
 * PRE: i IN [1,NC(n)]
 * POST: resultado = Resto (Cociente (n,Potencia (10,i-1),10)
*/
  static int digitoI (int i, int n)
  {
    return (n / (int)(Math.pow (10,i-1))) % 10;
  }
/*
 * FUNCION numeroCifras (Natural numero) ---> Natural
 * PRE: cierto
 * POST: ((numero=0)/\(r=1)) \/ ((numero>0)/\(r>0)/\(10^r-1 <= 10^r))
*/

/*
 * FUNCION cuantosCeros (Natural numero) ---> Natural
 * PRE: cierto
 * POST: resultado = SUM i IN [1,numeroCifras (numero)] |
 *                       (digitoI (i,numero) = 0) . 1 
*/

/*
 * FUNCION sumaEntre (Natural m, n) ---> Natural
 * PRE: cierto
 * POST: resultado es la suma de todos los numeros que hay en el
 *       intervalo cerrado [m,n]
 * POST: res = SUM i IN [m,n] . i
*/

/*
 * FUNCION esTriangular (Natural n) ---> Boolean
 * PRE: n > 0
 * POST: resultado es cierto si existe un numero "k" (>0) para
 *       el que la suma de los k primeros numeros naturales
 *       coincida con "n" y es falso e.o.c.
 * POST: res = ALGUN i IN [1,n].(n = sumaEntre (1,i))
*/

/*
 * FUNCION divide (Natural d, n) ---> Boolean
 * PRE: d > 0
 * POST: resultado = Resto (n,d) = 0
*/

/*
 * FUNCION esPrimo (Natural n) ---> Boolean
 * PRE: n > 0
 * POST: resultado = (n = 1) \/
 *                   TODOS i IN [2,n-1] . NO Divide (i,n)
*/

/*
 * FUNCION esCapicua1 (Natural n) ---> Boolean
 * PRE: cierto
 * POST: resultado = TODOS i IN [1,NC(n)/2] .
 *                     (digitoI (i,n) = digitoI (NC(n)-i+1,n))
 * DONDE: NC(n) = numeroCifras (n)
*/

/*
 * FUNCION inverso (Natural numero) ---> Natural
 * PRE: cierto
 * POST1: (NC (resultado) = NC (n)) /\
 *        TODOS i IN [1,NC(n)] . 
 *             (Cifra (NC(n)-i+1,resultado) = digitoI (i,n))
 * POST2: resultado = MAP i IN [1,NC(n)] . digitoI (NC(n)-i+1,n)
*/

/*
 * FUNCION esCapicua2 (Natural n) ---> Boolean
 * PRE: cierto
 * POST: resultado = TODOS i IN [1,NC(n)/2] .
 *                        (digitoI (i,n) = digitoI (NC(n)-i+1,n))
*/
  static boolean esCapicua2 (int n)
  {
    return n == inverso (n);
  }

//  DECLARACIONES DE PRUEBAS  ---------------------------------------

  static int prueba1_1 = cuantosCeros(0);
  static int prueba1_2 = cuantosCeros(20304005);
  static int prueba1_3 = cuantosCeros(12345);
  static boolean prueba1_cuantosCeros = (prueba1_1 == 1) &&
                                        (prueba1_2 == 4) &&
                                        (prueba1_3 == 0);
  static boolean prueba2_1 = esTriangular(1);
  static boolean prueba2_2 = esTriangular(9);
  static boolean prueba2_3 = esTriangular(10);
  static boolean prueba2_esTriangular = (prueba2_1 == true) &&
                                        (prueba2_2 == false) &&
                                        (prueba2_3 == true);
  static boolean prueba3_1 = esPrimo(1);
  static boolean prueba3_2 = esPrimo(49);
  static boolean prueba3_3 = esPrimo(101);
  static boolean prueba3_esPrimo = (prueba3_1 == true) &&
                                   (prueba3_2 == false) &&
                                   (prueba3_3 == true);
  static boolean prueba4_1 = esCapicua1(1);
  static boolean prueba4_2 = esCapicua1(421024);
  static boolean prueba4_3 = esCapicua1(42024);
  static boolean prueba4_esCapicua1 = (prueba4_1 == true) &&
                                      (prueba4_2 == false) &&
                                      (prueba4_3 == true);
  static int prueba5_1 = inverso(1);
  static int prueba5_2 = inverso(1024);
  static int prueba5_3 = inverso(123);
  static boolean prueba5_inverso = (prueba5_1 == 1) &&
                                   (prueba5_2 == 4201) &&
                                   (prueba5_3 == 321);
  static boolean prueba6_1 = esCapicua2(1);
  static boolean prueba6_2 = esCapicua2(421024);
  static boolean prueba6_3 = esCapicua2(42024);
  static boolean prueba6_esCapicua2 = (prueba6_1 == true) &&
                                      (prueba6_2 == false) &&
                                      (prueba6_3 == true);
  
//  PROGRAMA PRINCIPAL  ---------------------------------------------

  public static void main (String[] args)
  {
    System.out.println("PRUEBA1_cuantosCeros: " +
                       prueba1_cuantosCeros);
    System.out.println("PRUEBA2_esTriangular: " +
                       prueba2_esTriangular);
    System.out.println("PRUEBA3_esPrimo: " + prueba3_esPrimo);
    System.out.println("PRUEBA4_esCapicua1: " + prueba4_esCapicua1);
    System.out.println("PRUEBA5_inverso: " + prueba5_inverso);    
    System.out.println("PRUEBA6_esCapicua2: " + prueba6_esCapicua2);
  }
  
}