2010-10-29 25 views
2

J'écris quelques fonctions utiles dans C. L'un d'eux est isPalindrome().Puis-je avoir des commentaires sur cette fonction `isPalindrome()` dans C?

je me suis dit pour déterminer si un nombre est un palindrome ou non, je devrais ...

  • obtenir tous les chiffres dans un tableau
  • itérer à travers deux indices - commencent un à 0 et un à le nombre de matrices
  • incrémenter/décrémenter les index tout en inscrivant le tableau pendant qu'ils correspondent et si le nombre de matrices atteint 0, nous avons un palindrome (c'est-à-dire en terminant tous les chiffres).

je suis venu avec ...

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; 

} 

Est-ce généralement comment il est fait? J'apprenais C par moi-même, et même si je peux dire quand mon code compile et ne prend pas toute la journée pour travailler quelque chose, je n'ai aucun yeux d'expert pour me dire si je suis sur la bonne voie.

Alors, des améliorations ou des suggestions sur mon code?

Merci beaucoup!

+1

IsPalindrome est une fonction utile? Pour qui? ;-) –

+0

@Steven: Cela pourrait être utile pour les personnes qui font des défis [Project Euler] (http://projecteuler.net). :) –

+0

Project Euler * est la raison pour laquelle j'ai écrit ceci :) – alex

Répondre

5

Vous n'avez qu'à boucler pendant que i > j. Une fois i <= j, vous vérifiez simplement tous les caractères une deuxième fois.

+0

+1 mais quand i == j, ce n'est pas un deuxième contrôle de temps – pmg

+0

@pmg: quand i == j la comparaison sera toujours vraie. – JeremyP

+0

@Jeremy: oui, mais c'est la première fois * que * la comparaison est faite. – pmg

2

Bien que l'utilisation en ligne ++ et -- opérateurs dans ce qui suit peut sembler intelligent:

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

votre code sera plus facile à lire si vous mettez les à l'intérieur corps de la boucle:

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

De cette façon, le lecteur du code n'aura pas à penser aux effets secondaires possibles de changer les valeurs de i et j dans le cond test régional. Il n'y aura probablement pas d'effet mesurable sur la vitesse du code compilé (bien que, si les performances sont importantes pour cette fonction, vous devriez vérifier avec votre compilateur).

De plus, vous avez un bug où vous pouvez accéder à places[-1] si i == 0.

1

Je venais d'utiliser sprintf pour "convertir la chaîne en chiffres":

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

Merci, cela semble utile. Malheureusement, je ne savais pas à ce sujet quand j'ai écrit le code. – alex

1

En java

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

En C++ et 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); 
} 

Remarque, vous avez besoin pour écrire itoa fonction, si vous avez besoin de le faire pour une entrée numérique. Ou utilisez (link).

Voilà comment cela est généralement fait. Cela fonctionnerait également pour toutes les bases et pas seulement 10.

+0

pendant que nous sommes sur le sujet d'autres langages ... dans scala -> def isPalindrome (p: String) = p.equals (p.reverse) – Synesso

+0

Mon palindrome possible n'est pas une chaîne, c'est un 'int'. – alex

+0

Si vous voulez dire plus court est mieux alors dans J c'est: '((-: |.) @:" :) "0' – Margus