2016-10-09 1 views
1

Je travaille sur Project Euler, et sur le problème 4 mon code palindrome ne fonctionne pas. Plus précisément, il renvoie 998001 (999 * 999) comme s'il s'agissait d'un palindrome.Le code palindrome du numéro ne fonctionne pas

Le code pour vérifier le palindrome fonctionne, mais il continue de boucler et de remplacer la valeur max, même s'il ne s'agit pas d'un palindrome. Qu'est-ce que je rate?

Merci pour votre aide

public int palindromeNumber() 
{ 
    int max=0; 
    for(int x = 100; x<1000; x++) 
    { 
     for(int y = 100; y<1000; y++) 
     { 
      int z = x*y; 
      StringBuilder num = new StringBuilder(Integer.toString(z)); 
      StringBuilder rev = num.reverse(); 
      if(num==rev) 
      { 
       max=z; 
      } 
     } 
    } 
    return max; 
} 
+2

double possible de [Comment puis-je comparer les chaînes en Java?] (Http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Biffen

+0

utilisation .equals() pour comparer les chaînes –

Répondre

5

Si vous jetez un coup d'oeil sur la méthode StringBuilder.reverse() renvoie la référence au même objet (num dans votre cas)

@Override 
public StringBuilder reverse() { 
    super.reverse(); 
    return this; 
} 

Alors vous rev == num est toujours vrai et vous obtenez le 999 * 999 parce que c'est la fin d'une boucle

4

Votre code est correct, cependant, comme les commentaires l'ont souligné, vous comparez des adresses au lieu de chaînes.

Une chaîne est un objet, pas un type primitif, donc '==' ne fonctionnera pas lorsque vous comparez l'original et inversé.

Au lieu de cela, vous devez utiliser la méthode .equals(String).

est ici une preuve d'une doublure concept:

max = (num.equals(new StringBuilder(Integer.toString(z)).reverse())) ? z : max; 

Note:

Pour des raisons de performance, vous pourriez vouloir essayer de mettre en œuvre cette numériquement, les conversions et l'analyse syntaxique prennent du temps.

preuve rapide concept:

num = origNum 
while (num > 0) 
{ 
     digit = num % 10; 
     rev = rev * 10 + digit; 
     num = num/10; 
} 

if (origNum == rev) //max.. 
0
Please make some changes as - 

public static int palindromeNumber() 
{ 
    int max=0; 
    for(int x = 100; x<1000; x++) 
    { 
     for(int y = 100; y<1000; y++) 
     { 
      int z = x*y; 
      StringBuilder num = new StringBuilder(Integer.toString(z)); 
      StringBuilder numberCopy = new StringBuilder(num); 
      StringBuilder rev = num.reverse(); 

      if(numberCopy.toString().equals(rev.toString())) 
      { 
       max=z; 
      } 
     } 
    } 
    return max; 
} 

Le problème dans votre code est que, lorsque vous utilisez rev = num.reverse(); Puis à chaque fois dans la boucle Il modifie le même objet-num avec le nombre inversé et l'affecte ensuite à rev. Les deux références & pointent vers le même objet modifié (les valeurs num et rev sont 999 dans la dernière itération)

Ensuite, vous utilisez == les références de vérification pointent vers le même objet ou non, et voici et rev pointe sur le même objet, donc la condition est vraie à chaque fois.

Solution -

  1. objet copie à un autre objet avant de modifier ce qui peut être utilisé plus tard pour la comparaison. Utilisation égale à comparer les valeurs au lieu de ==.

+0

Bien que ce code puisse résoudre le problème du demandeur, vous devriez le [modifier] pour expliquer comment cela fonctionne et comment est-il différent de ce que le demandeur a essayé. – dorukayhan

+0

@dorukayhan Merci pour votre suggestion. Réponse éditée – Ravi

+0

Je l'ai changé pour cela, mais maintenant je reçois 580085. – cuttlefish