2016-11-10 4 views
0

Ich versuche, dieses Problem zu lösen:warum nicht gibt mir das Programm diese Meldung: ‚Programm für den Betrieb zu lange angehalten‘

Die Zahl 81 hat eine besondere Eigenschaft, eine gewisse Macht der Summe von seine Ziffern sind gleich 81 (neun Quadrat). Einundachtzig (81), ist die erste Nummer mit dieser Eigenschaft (ohne Berücksichtigung der Zahlen von einer Ziffer). Die nächste, 512. Lassen Sie uns beide Fälle mit den Details siehe

8 + 1 = 9 and 9^2 = 81 

512 = 5 + 1 + 2 = 8 and 8^3 = 512 

Wir brauchen eine Funktion zu machen, power_sumDigTerm(), die eine Zahl n und ausgeben kann, die n-th Laufzeit dieser Zahlenfolge empfängt. Die oben dargestellten Fälle bedeuten: Also habe ich das Problem wie folgt gelöst:

function findPow(sum,i) { 
    var counter = 0; 
    while (true) { 
    counter++; 
    if (Math.pow(sum,counter) === i) { 
     return true; 
    } else if (Math.pow(sum,counter) > i) { 
     return false; 
    } 
    } 
} 

function powerSumDigTerm(n) { 
    var index = 80; 
    var result = []; 
    function loop() { 
     index++; 
     var sum = 0; 
     var string = index.toString(); 
     for (var i =0;i<string.length;i++) { 
     sum += Number(string[i]); 
     } 
     if (findPow(sum,index)) { 
     result.push(index); 
     } 
     return (n === result.length) ? result[n-1] : loop() 
    } 
    return loop() 
} 

hier ist das Problem, wenn ich die Funktion lief und in 1 powerSumDigTerm(1) passieren. Die Ausgabe wäre 81 wie erwartet. Wenn wir jedoch 2 übergeben, console.log(powerSumDigTerm(2)), gibt die Funktion eine Nachricht zurück, die besagt: Program halted for running too long, sorry! Hat jemand irgendeine Erklärung, warum die Funktion das tut? und wie man es vermeidet?

+0

ein Fehler bei der Programmierung logir ist, die nie die while-Schleife gehen. Sie müssen die IF-Klausel korrigieren. –

+0

Meinst du in der findPow-Funktion? –

Antwort

1

Das Problem liegt innerhalb Ihrer findPow Funktion.

Betrachten Sie den Fall von 100. Wo die Summe 1 und 1 an die Macht einer beliebigen Zahl erhöht wird ergeben sich 1, d. H. i^x == 1. Sie müssen also einen Spezialfall von 1 behandeln, um das Problem zu beheben.

if (sum <= 1) return false; 

Weiterhin verwenden Sie Rekursion, die bald StackOverflow Ausnahme werfen. Ich testete unten Lösung und das funktioniert für n = 15. Da die Komplexität exponentiell ansteigt, erfordert die Berechnung einer höheren Anzahl eine viel optimierte Lösung.

function findPow(sum, i) { 
 
    if (sum <= 1) return; 
 
    var counter = 0; 
 
    while (true) { 
 
     counter++; 
 
     if (Math.pow(sum, counter) === i) { 
 
      return true; 
 
     } else if (Math.pow(sum, counter) > i) { 
 
      return false; 
 
     } 
 
    } 
 
} 
 

 
function powerSumDigTerm(n) { 
 
    var index = 80; 
 
    var result = []; 
 

 
    function next() { 
 
     index++; 
 
     var sum = 0; 
 
     var string = index.toString(); 
 
     for (var i = 0; i < string.length; i++) { 
 
      sum += Number(string[i]); 
 
     } 
 
     if (findPow(sum, index)) { 
 
      result.push(index); 
 
     } 
 
    } 
 
    while (result.length < n) 
 
     next() 
 

 
    return result[n - 1]; 
 
} 
 

 
console.log('1:', powerSumDigTerm(1)); 
 
console.log('2:', powerSumDigTerm(2)); 
 
console.log('5:', powerSumDigTerm(5)); 
 
console.log('10:', powerSumDigTerm(10));

+0

Ihre Erklärung ist großartig, ich habe nur Ihre Lösung ausgeführt, aber das Programm gibt mir immer noch diese Nachricht: 'Prozess wurde beendet. Es dauerte länger als 12000ms zu vervollständigen. Es ist von coderwars.com –

0

Wie @Adnan hat darauf hingewiesen, gibt es ein Problem in Ihrer findPow() Funktion, wo es eine Endlosschleife eingeben, wenn sum 1 ist, und Sie auch ein Risiko eines Stapelüberlauf haben Error.

Es hat wirklich keinen Sinn, Rekursion hier zu verwenden, wenn eine einfache Schleife ausreichen würde. Sie sollten auch vermeiden while(true) Schleifen, die in der Regel sind nur ein Zeichen der Faulheit:

function findPow(sum, i) { 
 
    for (var pow = 0; sum > 1 && Math.pow(sum, pow) <= i; pow += 1) { 
 
    if (Math.pow(sum, pow) === i) { 
 
     return true; 
 
    } 
 
    } 
 
    return false; 
 
} 
 

 
function sumDigits(number) { 
 
    var sum = 0; 
 
    var str = number.toString(); 
 
    for (var i = 0; i < str.length; i++) { 
 
    sum += Number(str[i]); 
 
    } 
 
    return sum; 
 
} 
 

 
function powerSumDigTerm(n) { 
 
    var result = []; 
 

 
    for (var index = 1; result.length < n; index += 1) { 
 
    if (findPow(sumDigits(index), index)) { 
 
     result.push(index); 
 
    } 
 
    } 
 

 
    return result[n - 1]; 
 
} 
 

 
for (var i = 1; i <= 20; i += 1) { 
 
    console.log(i, powerSumDigTerm(i)); 
 
}

+0

Ihre Erklärung ist großartig, ich lief nur Ihre Lösung, aber das Programm gibt mir immer noch diese Nachricht: 'Prozess wurde beendet. Es dauerte länger als 12000ms zu vervollständigen. Es ist von coderwars.com –

+0

Haben Sie die 'for' Schleife am Ende entfernt? Das war nur zu Demonstrationszwecken. – JLRishe

Verwandte Themen