2016-06-03 13 views
0

Ich versuche, das Projekt Euler Problem auf dem größten Palindrom Produkt in Javascript zu lösen, und ich verstehe nicht, warum das Programm nicht die Anweisung IF if (number.toString() == number.toString().split('').reverse().join('')) eintritt:kann die IF-Anweisung eingeben

(function palyndrom(max, min) { 
 
    
 
    top: 
 
    for (i = max; i > min; i--) { 
 
     for (c = max; c > min; c--) { 
 
      if(i*c == c*i) { 
 
       alert('same was before'); 
 
      } 
 
      
 
      else { 
 
       var number = i*c; 
 
       console.log('i*c = ' + i + '*' + c + ' = ' + number); 
 
    
 
//this if not entered, alert doesn't work 
 
       if (number.toString() == number.toString().split('').reverse().join('')) { 
 
        alert('PALYNDROM FOUND: i*c = ' + i + '*' + c + ' = ' + number); 
 
        break top; 
 
       } 
 
      } 
 
     } 
 
    } 
 
})(999, 900);

+0

die if-Anweisung? Haben Sie müde Debugging und Tracking der Inhalte der Variablen? – Danmoreng

+0

Sie sollten zuerst Ihre Fehler beheben. Wenn Sie Ihr Snippet ausführen, wird mindestens eines erstellt. –

+0

Sie vermissen eine Klammer darin. 6 {und 5} – Compass

Antwort

4
i*c == c*i 

führt immer zu wahren. Die Funktion wird niemals den else-Teil erreichen. Ich denke, was wollten Sie tun ist,

i === c 

statt:

(function palyndrom(max, min) { 
top: 
    for (var i = max; i > min; i--) { 
     for (var c = max; c > min; c--) { 
      if (i === c) { 
       alert('same was before'); 
      } else { 
       var number = i * c; 
       console.log('i*c = ' + i + '*' + c + ' = ' + number); 

       if (number.toString() == number.toString().split('').reverse().join('')) { 
        alert('PALYNDROM FOUND: i*c = ' + i + '*' + c + ' = ' + number); 
        break top; 
       } 
      } 
     } 

    } 
})(999, 900); 
+0

Dies wurde gemacht, um Wiederholungen wie 999 * 998 und 998 * 999 zu vermeiden; 'if (i === c)' es überprüft immer noch die Ausdrücke, die es vor – Olga

+0

@ Olga geprüft hat ... es wird immer wahr sein, da es die [Assoziative Eigenschaft] (https: //en.wikipedia. org/wiki/Associative_property) in maths ... die for-Schleife prüft nur die aktuellen Werte für i und c. Wenn Sie überprüfen möchten, ob Sie bereits die Kombination von i und c hatten, müssen Sie bereits überprüfte Kombinationen speichern. Aber ich würde sagen, dass es einfacher ist, es vollständig durchlaufen zu lassen und die Doppel am Ende zu entfernen. – Danmoreng

+0

ja, das dachte ich mir – Olga

0

Sie vermissen ein „}“, die zu einem Fehler führt.
Abgesehen davon ist i * c immer gleich c * i. Ich habe das Snippet so modifiziert, dass es das erste Palindrom zurückgibt. Die zweite Funktion gibt ein Array aller Palindrome zurück. Sie müssen nicht überprüfen, ob i! == c.

(function palindrome(max, min) { 
 
    for (var i = max; i > min; i--) { 
 
    for (var c = max; c > min; c--) { 
 

 
     var number = i * c; 
 

 
     if (number.toString() == number.toString().split('').reverse().join('')) { 
 
     console.log('PALINDROME FOUND: i*c = ' + i + '*' + c + ' = ' + number); 
 
     return number; 
 
     } 
 

 
    } 
 
    } 
 

 
})(999, 900); 
 
//PALINDROME FOUND: i*c = 993*913 = 906609 
 
(function palindrome(max, min) { 
 
    var palindromes = {}; 
 
    for (var i = max; i > min; i--) { 
 
    for (var c = max; c > min; c--) { 
 

 
     var number = i * c; 
 

 
     if (!(number in palindromes) && number.toString() == number.toString().split('').reverse().join('')) { 
 
     palindromes[number] = 1; 
 
     } 
 

 
    } 
 
    } 
 
    return Object.keys(palindromes); 
 
})(999, 900); 
 
//["819918", "824428", "861168", "886688", "888888", "906609"]

Verwandte Themen