Comment vérifier si un nombre est un palindrome?
N'importe quel langage. Tout algorithme. (sauf l'algorithme consistant à faire du nombre une chaîne puis à inverser la chaîne).
algorithm
language-agnostic
Esteban Araya
la source
la source
number
etis a palindrome
signifiera dans ce contexte: qu'en est-il de 13E31 (base dix)? 01210 (zéro non significatif)? + 10-10 + 1 (ternaire équilibré à cinq chiffres)?Réponses:
C'est l' un des problèmes du projet Euler . Quand je l'ai résolu dans Haskell, j'ai fait exactement ce que vous suggérez, convertir le nombre en chaîne. Il est alors trivial de vérifier que la chaîne est un pallindrome. S'il fonctionne assez bien, pourquoi se donner la peine de le rendre plus complexe? Être un pallindrome est une propriété lexicale plutôt que mathématique.
la source
to describe an algorithm to convert an integer to a string, which of course requires you to understand modulo
- non. Calculer dans le système numérique cible, être capable d'ajouter fera l'affaire (pensez à la façon dont vous convertissez généralement du décimal au binaire - être utilisé pour penser que le calcul signifie binaire ne signifie pas que vous ne pouvez pas faire, par exemple, l' arithmétique décimale (et vous pouvez le faire conversion de binaire en décimal sans division ni modulo 2).Pour tout nombre donné:
Si
n == rev
alorsnum
est un palindrome:la source
num
division après (frappe plus lâche), vous devrez le fairenum = floor(num / 10)
.Fonctionne uniquement pour les entiers. Il n'est pas clair d'après l'énoncé du problème si les nombres à virgule flottante ou les zéros non significatifs doivent être pris en compte.
la source
Au-dessus de la plupart des réponses ayant un problème trivial est que la variable int pourrait éventuellement déborder.
Reportez-vous à http://articles.leetcode.com/palindrome-number/
la source
la source
Poussez chaque chiffre individuel sur une pile, puis retirez-les. Si c'est la même chose en avant et en arrière, c'est un palindrome.
la source
Je n'ai pas remarqué de réponses qui résolvaient ce problème en n'utilisant pas d'espace supplémentaire, c'est-à-dire que toutes les solutions que j'ai vues utilisaient soit une chaîne, soit un autre entier pour inverser le nombre, ou d'autres structures de données.
Bien que des langages comme Java s'enroulent sur le débordement d'entier, ce comportement n'est pas défini dans des langages comme C. ( Essayez d'inverser 2147483647 (Integer.MAX_VALUE) en Java ) La
solution de contournement pourrait être d'utiliser un long ou quelque chose du genre mais, stylistiquement, je ne suis pas tout à fait comme cette approche.
Maintenant, le concept d'un nombre palindromique est que le nombre doit lire la même chose vers l'avant et vers l'arrière. Génial. En utilisant ces informations, nous pouvons comparer le premier chiffre et le dernier chiffre. L'astuce est, pour le premier chiffre, nous avons besoin de l'ordre du nombre. Disons, 12321. Diviser cela par 10 000 nous donnerait le premier 1. Le 1 de fin peut être récupéré en prenant le mod avec 10. Maintenant, pour réduire cela à 232
(12321 % 10000)/10 = (2321)/10 = 232
.. Et maintenant, le 10000 devrait être réduit d'un facteur 2. Alors, passons maintenant au code Java ...Modifié selon la suggestion de Hardik pour couvrir les cas où il y a des zéros dans le nombre.
la source
En Python, il existe un moyen rapide et itératif.
Cela évite également les problèmes de mémoire avec la récursivité (comme l'erreur StackOverflow en Java)
la source
Le moyen le plus rapide que je connaisse:
la source
Juste pour le plaisir, celui-ci fonctionne également.
la source
Pourquoi rejeter cette solution? C'est facile à mettre en œuvre et lisible . Si on vous demandait sans ordinateur à portée de main s'il
2**10-23
s'agit d'un palindrome décimal, vous le testeriez sûrement en l'écrivant en décimal.En Python au moins, le slogan «les opérations sur les chaînes sont plus lentes que l'arithmétique» est en fait faux. J'ai comparé l'algorithme arithmétique de Smink à une simple inversion de chaîne
int(str(i)[::-1])
. Il n'y avait pas de différence significative de vitesse - il s'est produit que l'inversion des cordes était légèrement plus rapide.Dans les langages compilés (C / C ++), le slogan peut tenir, mais on risque des erreurs de débordement avec de grands nombres.
Résultats en quelques secondes (moins c'est mieux):
la source
J'ai répondu au problème d'Euler d'une manière très brutale. Naturellement, il y avait un algorithme beaucoup plus intelligent à l'affichage lorsque je suis arrivé au nouveau fil de discussion associé déverrouillé. A savoir, un membre qui est passé par le manche Begoner avait une approche tellement originale que j'ai décidé de réimplémenter ma solution en utilisant son algorithme. Sa version était en Python (en utilisant des boucles imbriquées) et je l'ai réimplémentée dans Clojure (en utilisant une seule boucle / récurrence).
Ici pour votre amusement:
Il y avait aussi des réponses en Common Lisp, mais elles m'étaient impossible à croiser.
la source
Voici une version de Scheme qui construit une fonction qui fonctionnera sur n'importe quelle base. Il a un contrôle de redondance: retourne false rapidement si le nombre est un multiple de la base (se termine par 0).
Et il ne reconstruit pas tout le nombre inversé, seulement la moitié.
C'est tout ce dont nous avons besoin.
la source
Solution récursive en ruby, sans convertir le nombre en chaîne.
la source
Version Golang:
la source
Soulevez le premier et le dernier chiffres et comparez-les jusqu'à ce que vous soyez à court. Il peut y avoir un chiffre à gauche, ou pas, mais de toute façon, si tous les chiffres sautés correspondent, c'est un palindrome.
la source
Voici une autre solution en C ++ utilisant des modèles. Cette solution fonctionnera pour la comparaison de chaînes de palindrome insensible à la casse.
la source
une méthode avec un facteur constant un peu meilleur que la méthode @sminks:
la source
voici une # version:
la source
Un nombre est palindromique si sa représentation sous forme de chaîne est palindromique:
la source
la source
Pour vérifier que le numéro donné est Palindrome ou non (Java Code)
la source
Un grand nombre des solutions affichées ici inverse l'entier et le stocke dans une variable qui utilise un espace supplémentaire
O(n)
, mais voici une solution avecO(1)
espace.la source
J'utilise toujours cette solution python en raison de sa compacité.
la source
Essaye ça:
la source
Voici une solution utilisant des listes sous forme de piles en python:
sauter la pile ne considère que le côté le plus à droite du nombre pour la comparaison et il échoue rapidement à réduire les contrôles
la source
la source
la source
la source
De manière récursive, pas très efficace, il suffit de fournir une option
(Code Python)
la source