Puis-je s'il vous plaît obtenir des commentaires sur cette fonction `isPalindrome ()` en C?

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

  •  27-09-2019
  •  | 
  •  

Question

Je suis en train d'écrire quelques fonctions utiles en C. L'un d'eux est isPalindrome().

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 par deux indices - un comptage commence à 0 et un au tableau
  • incrément / décrément les indices tandis que le tableau subscripting alors qu'ils correspondent et si le nombre de tableau arrive à 0, nous avons un palindrome (à savoir la finition en passant par 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'apprends C par moi-même, et bien que je peux dire quand mes compiles de code et ne prend pas toute la journée pour en tirer quelque chose, je n'ai pas yeux experts pour me dire si je suis sur la bonne voie.

Ainsi, toute amélioration ou des suggestions sur mon code?

Merci beaucoup!

Était-ce utile?

La solution

Il vous suffit de boucle while i > j. Une fois i <= j, vous en train de vérifier tous les personnages une seconde fois.

Autres conseils

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

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

votre code sera plus facile à lire si vous mettez les dans le corps de la boucle:

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

De cette façon, le lecteur du code ne sera pas avoir à réfléchir sur les effets secondaires possibles de changer les valeurs de i et j dans le test conditionnel. Il y aura probablement aucun effet mesurable sur la vitesse du code compilé (bien que, si la performance est importante à cette fonction, vous devriez vérifier avec votre compilateur).

En outre, vous avez un bug où vous aurez accès à places[-1] si i == 0.

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

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

Dans java

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

Dans 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 devez écrire itoa fonction , si vous avez besoin de faire cela pour une entrée numérique. Ou utilisez ( ).

est comment il est généralement fait. Cela fonctionne également pour toutes les bases et non seulement 10.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top