6
votes

Si un numéro de 15 chiffres est-il le meilleur moyen de trouver le prochain palindrome?

en C ++ Quelle sera la logique la plus rapide pour trouver le prochain palindrome d'un numéro de 15 chiffres donné? Par exemple, quel sera le prochain palindrome de: 134567329807541?


5 commentaires

+1 question très intéressante, imo


Que signifie "le prochain palindrome de x"?


Un palindrome est quelque chose qui lit les mêmes verso et en avant (comme vous, espérons-le que vous saurez de l'esquisse du perroquet de Monty Python!), Je suppose que "le prochain palindrome de x" est le premier numéro> = x qui, dans la base 10, lit le même verso et en avant.


Vous avez déjà un certain nombre de réponses. Je veux juste souligner que, comme cela a un c ++ tag, std :: string (que vous devez utiliser) a beaucoup de fonctions membres pour manipuler son contenu. Malheureusement, pour des raisons historiques, certains d'entre eux travaillent avec des index, certains travaillent avec des itérateurs, de nombreux (mais pas tous) ont des versions pour les deux, beaucoup (mais pas tous) ont des algorithmes alternatifs dans le entête. Un bon moyen de inverser une séquence d'inverser les itérateurs d'accès aléatoire utilise std :: inverse (inverse (inverse () , un bon moyen de comparer deux séquences arbitraires est std :: égal () < / code>.


Je me demande: "Suivant" signifie-t-il que si vous avez déjà un palindrom, vous devriez obtenir le suivant ou vous contentez-vous?


5 Réponses :


3
votes

Je crois que c'est comme ça

  1. Divisez le nombre en trois parties 1345673 2 9807541
  2. Retournez le dernier 1457089
  3. S'il est plus grand que la première partie (c'est dans ce cas)
    • FirstPart ++
    • MiddlePart = 0
    • Flip Première partie et remplacez la dernière partie.

5 commentaires

C'est la même chose que je suis venu avec, donc +1.


Il y a un petit bug ici, je pense que ... Par exemple, jetez un coup d'œil sur ce qui arrive à l'entrée "13 5 09" (en utilisant un numéro à cinq chiffres pour plus de commodité). Le prochain palindrome est "13 5 31", mais l'algorithme donne "14 0 41". Pour résoudre ce problème, l'étape 2 devrait être: retournez la partie première la partie, et l'étape 3 devrait être: si elle est plus petite que la partie Dernière .


Un autre cas de bord à considérer est si l'entrée est le dernier palindrome à 15 chiffres ("999999999999999999999").


Il y a tellement de bugs que je doute que votre algorithme soit même utile. 1. Retournez la partie première et utilisez comme dernière partie. Si le résultat est plus grand que le numéro d'origine, vous êtes DON. 2. Si c'est plus petit, incrémentez la partie moyenne . 3. Si la partie centrale était de 9 (maintenant 10), faites-la à 0 et incrémentez la première partie.


Oh, j'ai oublié: dans le dernier cas, retournez la première partie incrémentée et utilisez-la comme la nouvelle partie dernière.



1
votes

Je ne suis pas sur le point de ne rien mettre en œuvre, mais j'imagine que la logique serait:

  1. Split le nombre au milieu de la chaîne: x étant la partie gauche et y étant la partie droite.
  2. let x '= {x + 1 si inverse (x)
  3. Le résultat est alors concat (x ', inverse (x'));

    Si la longueur est inégale, vous devez traiter le chiffre moyen séparément. Mais c'est assez trivial.


0 commentaires

16
votes
  • diviser le nombre en trois parties, tête , moyen , queue

    1345673 2 9807541

  • inverse tête et comparez-le à queue 3765431

  • si inverse (tête) <= la queue (s'ils sont égaux, l'entrée initiale est un palindrome et que vous voulez le suivant)

    • Si milieu <9 , incrément moyen
    • autre incrément tête pièce et ensemble MID: = 0
    • résultat: = tête inverse de la tête (tête) .

      1345673 3 inverse (1345673) => 134567333765431


5 commentaires

et que se passe-t-il si inverse (tête)> queue ??


C'est laissé comme un exercice :-)


Si inverse (tête)> la queue, vous continuez avec "résultat: = ..."


Et si vous avez même un nombre de chiffres?


@Cosminvacaoiu 15 n'est pas un nombre même.



0
votes

Je pense que l'algo suivant devrait également fonctionner .. Il est plus facile de mettre en œuvre également xxx pré>

dans l'espoir que l'exemple suivant aidera à mieux comprendre l'algo p>

Soit NOS: - 23469 9 12367 P>

       So HEAD -> 23469   MID -> 9   TAIL --> 12367

       step 2:-   23469 9 +1 = 23470 0 
              (now HEAD -> 23470 MID -> 0 HEAD_REV -> 07432 )


2 commentaires

oui il y a une faille !! Ex: - 34512 Head- 34 MID - 5 Tail- 12 Votre réponse 35553 Mais un pallindrome plus petit et une réponse correcte 34543 !!


Corriger l'algo devrait être, calculer la tête moyenne et la queue ... Si la tête> la tête de la queue - tête de tête à tête arrière-tête si la tête <= la queue - tête + 1 mi-inverse-tête + 1



0
votes
Split the number into three parts head, mid and tail

if reverse(head)>tail 
result := head mid reverse(head)
else if reverse(head)= tail && mid<9 
    mid++
    result := head mid tail
else 
mid =0
head++
result := head mid reverse(head)

0 commentaires