Programa para Saber si un Numero es Simetrico o no

Hola ,Buenas Tardes soy nuevo en este foro, quiero ver si me podrian ayudar con un programa , Resulta que necesito saber si un numero es Simetrico o no, De cualquier cantidad de digitos
Por ejemplo, 123321, Ese numero es simetrico porque al doblarlo a la mitad queda 123, y si fuera un numero con cantidad impar de digitos seria asi, 1235321, el 5 se ignoraria , ese es simetrico tambien.

Por ahora solo eh pensado en Capturar el Numero, Despues dentro de un Ciclo separar los digitos iniciando desde el ultimo, y cada digito lo voy guardando en una posicion del arreglo para luego compararlos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

número palindrómico

¿Te refieres a un número palindrómico? Por suerte, hay muchos programas de ejemplo ahí afuera (en Internet). Google es tu mejor amigo.

Lo que puedes hacer es

Lo que puedes hacer es convertir el número en cadena y luego comparar el primer (p) y el último carácter (u), si son iguales continuas comparando los siguientes dos caracteres y si son diferentes regresas falso.

 

Cuando p y u se cruzan te detienes ( no tiene caso volver a comparar todo )

Espero que esto ter sirva

Imagen de julgo

segunda opcion

comparas tu cadena original con el resultado del metodo reverse() y toString() de la clase StringBuilder (incluso sera entendible estando todo en una sola linea).

¿Cuál es la más rápida?

¿Y cuál creen ustedes que sea la solución más rápida? ¿La de @OscarRyz o la de @julgo?

Enviado desde mi tableta prehistórica de piedra.

Hay una forma de saber...

Hay una forma de saber... probando..

Imagen de ezamudio

Otra forma de saber

Otra forma de saber es simplemente analizando los algoritmos.

El método de Oscar requiere que conviertas el número a String, tengas dos contadores, y revises cuando mucho la mitad de la cadena.

El método de julgo requiere que conviertas el número a String, luego lo reviertas (generando una segunda cadena) y verifiques si las cadenas son iguales (lo cual causa que se comparen, en el peor de los casos, todos los caracteres de la cadena).

Si vas a revisar un número de 10 dígitos, el algoritmo de Oscar requiere que hagas cuando mucho 5 comparaciones. El de julgo requiere 10 comparaciones, entre dos cadenas.

Exacto, esa es la forma

Exacto, esa es la forma correcta de comparar, midiendo es la complejidad del algoritmo. Hay una forma de expresar eso con notación BigO aunque no recuerdo exactamente como calcularlo para saber cual sería el valor para estos dos; Supongo que la mía sería O(n/2) y la segunda sería O(n*2) o algo así.

Usando la fuerza bruta para comparar ( escribiendo el programa y corriendolo ) la primera versión es 10x más rápida (6,000 ns vs 60,000 ns) aunque honestamente la diferencia es irrelevante ya que ninguno de los dos tarde más de una décima de milisegundo ( 1 milisegundo = 1,000,000 nanosegundos) usando la cantidad más alta posible en un long ( 19 dígitos )

Voy a dejar pasar unos días más ( en lo que pasa el tiempo para entregar la tarea de DavidExplosive) antes de poner el código, aunque debe de ser trivial de implementar en casa (hint, los números long se escriben con una L al final y para obtener nano segundos del sistema se usa System.nanoTime )

Imagen de ezamudio

medición

Cómo mediste el performance? Es muy difícil hacerlo bien, particularmente para la JVM.

Tienes que ejecutar el código varias veces antes de medir su tiempo (unas 1000 veces mínimo), para que la JVM agarre la onda y active el JIT. Y rezar para que no se active la recolección de basura mientras estás midiendo.

Re: medición

Quizás @OscarRyz tuvo en cuenta los siguientes tips: How do I write a correct micro-benchmark in Java? ;-)

A pus claro!! Nah, en

A pus claro!!

Nah, en realidad le dí flechita para arriba para repetir el comando y luego enter como 10 veces... en todas me salió lo mismo. Y pues ya.

A ver lo voy a meter en un for...

En un for, repitiendo 100

En un for, repitiendo 100 millones de veces ( le puse mil millones, pero se tardó mucho ) el primero tada 60 ns en promedio y el segundo 140 ns. de 10x pasa a 2x porque la VM optimiza ambos

Imagen de ezamudio

inline?

La cadena que usas para comparar, es inline? O sea está en código duro? No debería...

Imagen de julgo

y con una pequeña comprobacion

mmm no se que tanto ayudaria para ambos metodos hacer una pequeña comprobacion del numero y evaluar si es divisible entre 11 (siempre y cuando su cantidad de cifras sea par).

Imagen de ezamudio

121

121 es divisible entre 11 y es simétrico, pero su cantidad de cifras es non.

Imagen de julgo

corrigiendo

la comprobacion solo seria para los numeros de cifra par, para los de cifra impar seguir usando cualquiera de los algoritmos anteriores

No esta inline, está

No esta inline, está convertida desde el long vía

 

Yo creo que ya pasó la fecha de entrega de la tarea, ahí va la impl.

 

Mi HW: i7 @ 2.5ghz con Java 7