JavaScriptsMathematik

Teiler einer Zahl

Listet alle ganzzahligen Teiler einer Zahl auf, zählt sie und verrät, ob es sich um eine Primzahl handelt.

Von david97 wurde dieses Script eingeschickt, das euch neben allen ganzzahligen Teilern einer Zahl auch deren Anzahl ausgibt. Zusätzlich erfahrt ihr, ob die eingegebene Zahl eine Primzahl ist oder nicht.

Die Bedienung ist denkbar einfach: Tragt eine ganze Zahl ein und klickt auf „Teiler anzeigen". Voreingestellt ist die 25, die drei Teiler hat — 1, 5 und 25. Ein Teiler ist dabei jede Zahl, die ohne Rest in der eingegebenen Zahl aufgeht; die 1 und die Zahl selbst zählen immer mit.

Genau daran hängt auch die Primzahl-Auskunft: Eine Primzahl ist definiert als eine natürliche Zahl größer als 1, die außer 1 und sich selbst keine Teiler hat — sie hat also genau zwei. Deshalb ist die 1 selbst keine Primzahl: Sie hat nur einen einzigen Teiler. Die 2 dagegen ist eine, und zwar die einzige gerade Primzahl, denn jede andere gerade Zahl lässt sich durch 2 teilen.

Die Anzahl der Teiler ist übrigens eine erstaunlich aussagekräftige Größe. Zahlen mit auffällig vielen Teilern — 12, 24, 60, 360 — tauchen nicht zufällig in alten Maßsystemen auf: 60 Minuten, 360 Grad. Sie lassen sich besonders bequem in gleiche Teile zerlegen. Zahlen mit genau drei Teilern sind dagegen immer Quadrate von Primzahlen, so wie die voreingestellte 25 = 5 × 5.

Verwandte Scripts im Archiv: Teiler von zwei Zahlen vergleicht zwei Zahlen miteinander, der größte gemeinsame Teiler liefert davon den größten, und die Primfaktorzerlegung zeigt, aus welchen Primzahlen eure Zahl zusammengesetzt ist. Eine Liste von Primzahlen bekommt ihr bei Primzahlen.

Mathematik Baujahr 2008 läuft in deinem Browser
Bitte auf den Knopf drücken
Eingesandt von david97

So funktioniert das Script

Das Script hat drei Aufgaben: Es liest die eingegebene Zahl, sucht in einer Schleife nach Teilern und setzt aus dem Fund den Ausgabetext zusammen. Die eigentliche Suche ist ein sogenannter Brute-Force-Ansatz — es wird schlicht jede Zahl von 1 bis zur eingegebenen Zahl durchprobiert. Das ist nicht der schnellste Weg, aber der verständlichste.

const zahl = parseInt(feld.value.trim(), 10);

if (isNaN(zahl) || zahl < 1) {
  ausgabe.textContent = "Bitte tragt eine ganze Zahl ab 1 ein.";
  return;
}

parseInt() macht aus dem eingetippten Text eine ganze Zahl und schneidet Nachkommastellen ab. Die 10 als zweiter Wert ist die Basis des Zahlensystems — sie sagt „rechne im Zehnersystem" und sollte man immer mitgeben, damit eine führende Null nicht als Oktalzahl missverstanden wird. isNaN() steht für „is Not a Number" und erkennt, wenn gar keine Zahl im Feld stand. Mit return steigt die Funktion aus, bevor sie weiterrechnet.

const gefunden = [];
for (let i = 1; i <= zahl; i++) {
  if (zahl % i === 0) {
    gefunden.push(i);
  }
}

Das ist das Herzstück. Der Operator % („Modulo") liefert den Rest einer Division: 25 % 5 ergibt 0, weil 5 glatt in 25 aufgeht, 25 % 4 dagegen 1. Ist der Rest 0, haben wir einen Teiler gefunden und legen ihn mit push() hinten an das Array gefunden an. Am Ende der Schleife stehen dort alle Teiler in aufsteigender Reihenfolge.

Die Ergebnisse erst zu sammeln und ganz am Schluss auszugeben, ist übrigens deutlich flotter, als die Seite in jedem Schleifendurchgang neu zu beschriften. Jede Änderung an innerHTML zwingt den Browser dazu, die Anzeige neu aufzubauen — bei tausend Teilern wären das tausend Neuaufbauten statt einem einzigen.

const istPrimzahl = gefunden.length === 2;

Die Primzahl-Prüfung kostet keine zusätzliche Rechnung, sie ergibt sich aus der Liste: gefunden.length ist die Anzahl der Einträge im Array. Genau zwei Teiler — die 1 und die Zahl selbst — bedeuten eine Primzahl. Bei der 1 enthält die Liste nur einen Eintrag, bei 25 sind es drei. Das Ergebnis ist ein Wahrheitswert, also true oder false.

"PS: " + zahl + (istPrimzahl ? " ist eine Primzahl" : " ist keine Primzahl");

Hier entscheidet ein bedingter Ausdruck über den Satz am Ende: Vor dem Fragezeichen steht die Bedingung, dahinter der Text für „trifft zu", nach dem Doppelpunkt der für „trifft nicht zu". Das ist die Kurzform eines if … else und praktisch, wenn nur zwischen zwei Texten gewählt werden soll. Der join("; ") weiter oben verbindet alle Teiler mit Semikolon und Leerzeichen zu einer Zeile — wollt ihr Kommas, schreibt dort join(", ").

Anpassen lässt sich außerdem die Obergrenze MAX_ZAHL. Sie steht auf einer Million, weil die Schleife bei sehr großen Zahlen spürbar Zeit braucht: Für jede Zahl bis zur Eingabe wird ein Rest berechnet, bei zehn Millionen sind das eben zehn Millionen Rechenschritte.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Mathematik