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.
- Inicie sesión o regístrese para enviar comentarios
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
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..
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 )
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
inline?
La cadena que usas para comparar, es inline? O sea está en código duro? No debería...
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).
121
121 es divisible entre 11 y es simétrico, pero su cantidad de cifras es non.
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