Kubikzahlen

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Javascript</language>
<run id="641389ca1f2a2">
maximaleZahl = 20000
maximalKubikzahl = Math.ceil(Math.pow(20000,(1.0/3.0)));

liste = {};

function naechsteIteration(bisherige,Summe,letzterSummand){
  if(Summe > maximaleZahl) return;
  liste[Summe] = bisherige;
  // wir müssen nur noch grössere Summanden suchen, als die, die wir bislang verwendet haben
  for(var i=letzterSummand+1; i < maximalKubikzahl; i++){
    // bisherige Summanden kopieren und einen weiteren an die Liste anfügen
    var a = Array.from(bisherige);
    a.push(i);
    // Summe um die gerade angefügte Zahl^3 erhöhen
    naechsteIteration(a,Summe+(i*i*i),i);
  }
}

naechsteIteration([0],0,0);

// liste enthält nun alle Zahlen und für jede Zahl die Summanden (Basen) als Liste
// liste[9] = [0, 1, 2] = 0^3+1^3+2^3 = 9
// liste[12758] = null nicht in M
// liste[12759] = [0, 5, 6, 7, 11, 14, 20]
// liste[12760] = [0, 12, 14, 15, 17]

// aus allen Liste nur noch Zahlen verwenden als einzelnes Array (Menge M)
M = Object.keys(liste);

console.log("Es folgen alle Zahlen bis "+maximaleZahl+". Per Copy&Paste der Zeile kopierbar.");
console.log(M);

// Suche nach der ersten Zahl k, bei der alle darauffolgenden Zahlen in M sind
var gefunden = false;
for(var k=1; k < maximaleZahl; k++){
  var q = (k+1)*(k+1)*(k+1);
  for(var z=k; z <= q; z++){
    // gibt es eine Zahl z NICHT in M, innerhalb von k bis q, dann können wir aufhören
    if(!liste[z]) break;    

    // wenn wir von k bis q durchgelaufen sind, oder wir am Ende der Liste sind 
    // können wir sagen, es gibt kein z mehr, was nicht mehr in der Liste ist.    
    if(z >= maximaleZahl) {
      console.log("K = "+k+" hatte nur noch aufeinanderfolgende Elemente in M bis "+maximaleZahl);
      gefunden = true;
      break;
    }
    // theoretisch müssten wir das bis q machen, jedoch ist 
    // 12759^3 = 2077064161479, was wir für maximaleZahl wählen müssten, 
    // das dauert wieder zu lange. Deshalb testen wir nur bis maximaleZahl
    if(z == q) {
      console.log("K = "+k+" hatte "+q+" aufeinanderfolgende Elemente in M");
      gefunden = true;
      break;
    }
  }
  if(gefunden) break;
}
</run>