¿Puedo complacer a obtener alguna información sobre este isPalindrome) `` la función (en C?

StackOverflow https://stackoverflow.com/questions/4048312

  •  27-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo algunas funciones útiles en C. Uno de ellos es isPalindrome().

Me imaginé para determinar si un número es un palíndromo o no, lo siguiente ...

  • obtener todos los dígitos en una matriz
  • iterar a través de dos índices - iniciar uno a 0 y uno a la matriz recuento
  • incremento / decremento mientras que los índices subscripting la matriz, mientras que igualar y si el recuento de matriz llega a 0 tenemos un palíndromo (es decir, el acabado de pasar por todos los dígitos).

Se me ocurrió ...

int isPalindrome(int num) {

    int places[100];
    int i = 0;
    while (num > 0) {
        places[i++] = num % 10; 
        num /= 10;
    }

    int j = 0;
    while (i >= 0 && places[j++] == places[--i]) {
    }
    return i == -1;

}

¿Es esto por lo general cómo se hace?

Estoy aprendiendo C por mí mismo, y aunque puedo decir cuando mis compila el código y no ocupa todo el día para resolver algo, no tengo ninguna ojos expertos para decirme si estoy en el camino correcto.

Por lo tanto, cualquier mejora o sugerencias sobre mi código?

Muchas gracias!

¿Fue útil?

Solución

Sólo tiene que bucle while i > j. Una vez i <= j, se le acaba la comprobación de todos los personajes por segunda vez.

Otros consejos

A pesar de que el uso de los operadores ++ y -- en línea en la siguiente podría parecer inteligente:

while (i >= 0 && places[j++] == places[--i]) { 
} 

su código será más fácil de leer si se pone los dentro de el cuerpo del bucle:

while (i >= 0 && places[j] == places[i-1]) { 
    j++;
    i--;
} 

De esta manera, el lector del código no tendrá que pensar en los posibles efectos secundarios de los cambios en los valores de i y j dentro de la prueba condicional. Probablemente habrá ningún efecto medible en la velocidad del código compilado (aunque, si el rendimiento es importante para esta función, usted debe consultar con su compilador).

Además, tienes un error por el que se accede a places[-1] si i == 0.

Yo sólo haría uso de sprintf a "convertir la cadena de dígitos":

char places[100];
sprintf(places, "%i", num);
i = strlen(places);

En java

static boolean isPalindrome(String p) {
    return p.equals(new StringBuilder(p).reverse().toString());
}

en C ++ y C

int IsPalindrome(char *string) {
    int bottom = 0, top;

    top = strlen(string) - 1;
    while(bottom < top && string[bottom] == string[top]) {
        ++bottom;
        --top;
    }
    return (bottom >= top ? 1:0);
}

Tenga en cuenta, que necesita para escribir itoa función, si lo que necesita hacer esto para un número de entrada. O uso ( enlace).

Eso es lo que generalmente se practica. Esto también funcionaría para todas las bases y no sólo 10.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top