Algorithmen II
Mit unserem Wissen über die Python Grundlagen und Funktionen sind wir bestens gerüstet, um komplexere algorithmische Probleme zu lösen. Verwende wo möglich Funktionen, und verwende Tests, um zu überprüfen, ob dein Code funktioniert!
Verwende keine vordefinierten Funktionen wie z.B. max() oder sorted(), sondern programmiere alles selber.
Aufgabe L1: Maximum
Teil 1: Zwei Zahlen sollen eingegeben (input) und die grössere der beiden Zahlen ausgegeben werden. Sind die Zahlen gleich gross, soll einfach die Zahl ausgegeben (print) werden.
Teil 2: Schreibe Code um als Funktion max2(a, b), die das Maximum von a und b mit return zurückgibt. Die Eingabe und die Ausgabe sollen ausserhalb der Funktion erfolgen.
Teil 3: Schreibe eine Funktion max3(a, b, c), die das Maximum von drei Zahlen zurückgibt. Verwende dazu die max2 Funktion!
Aufgabe L2: Sortieren
def sort(a, b, c):
if a > b:
if b > c:
print(a, b, c)
elif a > c:
print(a, c, b)
else:
print(c, a, b)
elif b > c:
if a > c:
print(b, a, c)
else:
print(b, c, a)
else:
print(c, b, a)
sort(int(input()), int(input()), int(input()))
assert with_input("3", "1", "2") and output_lines() == ["3", "2", "1"]
assert with_input("-3", "1", "2") and output_lines() == ["2", "1", "-3"]
Aufgabe L3: Ratespiel (optional: mittel)
Eine geheime Zahl zwischen 0 und 100 wird in einer Variablen gespeichert. Der Spieler versucht solange die geheime Zahl zu erraten, bis er erfolgreich ist.
Zusatzpunkte:
Das Programm gibt dem Spieler Tipps, z.B. ’Ausgabe: «Die eingegebene Zahl ist zu klein»’
Die Anzahl Fehlversuche wird gezählt und am Schluss ausgegeben.
Aufgabe L4: Ratespiel umgekehrt (optional: mittel)
Der Spieler merkt sich eine geheime Zahl zwischen 0 und 100, der Computer soll sie erraten. Der Spieler soll dem Computer bei jedem Versuch mitteilen, ob die gesuchte Zahl kleiner oder grösser als die Vermutung ist:
Ist die geheime Zahl kleiner als die Vermutung, muss der Spieler < eingeben.
Ist die geheime Zahl grösser als die Vermutung, muss der Spieler > eingeben.
Ist die geheime Zahl erraten, soll = eingegeben werden.
Zusatzpunkte:
Mathematische Algorithmen
Mit iterativen Algorithmen berechnen wir Schritt für Schritt das gewünschte Resultat. Das Resultat wird in einer Variable sukzessive akkumuliert. In einer Schleife wird jede Runde ein Wert hinzugefügt, beispielsweise durch Addition oder Multiplikation.
Beispiel: Summe aller natürlicher Zahlen
Aufgaben M
Aufgabe M1: Iterative Algorithmen
Schreibe für jede Aufgabe eine Funktion, die passende Argumente entgegennimmt und das Resultat zurück gibt.
Schreibe alle Funktionen selbst und verwende nur ganz rudimentäre Sprachelemente und keine vordefinierten Funktionen.
Multiplikation durch Additionen ausdrücken
Hoch-Rechnen durch Multiplikation ausdrücken
Hoch-Rechnen durch Additionen ausdrücken
Ganzzahldivision mit Rest mit Addition und Subtraktion
Entscheiden ob eine beliebige Zahl eine Zweierpotenz ist oder nicht
Hinweise:
$7*3 = 0 + 3 + 3 + 3 + 3 + 3 + 3 + 3$
Wir benötigen eine Schleife, die 7 mal 3 zum Resultat addiert.
Ausserhalb der Schleife deklarieren wir eine Variable, die das Resultat enthält und zu Beginn 0 ist, z.B. result = 0.
Wie lautet die Rechnung für das Hoch-Rechnen mit Multiplikation? Und was ist der Initialwert von result?
Aufgabe M2: Quersumme
Die Quersumme einer Zahl ist die Summe all ihrer Ziffern. Die Quersumme beispielsweise von $413$ ist $4 + 1 + 3 = 8$.
Schreibe eine Funktion quersumme(x), die die Quersumme von x zurückgibt!
Zuerst ohne diese Hinweise probieren!
Benütze x % 10 um den Wert der hintersten Ziffer zu berechnen!
Mit einer geeigneten Division kannst du auf die nächste Stelle vorrücken.
Wann muss die while-Schleife abbrechen?
Primzahlen
Theorie
Was ist eine Primzahl?
Wenn nötig: Nachlesen auf
Primzahl (erster Satz)!
Primzahl-Test:
Eine Funktion, die herausfindet (Also True oder False zurückgibt), ob eine Zahl prim ist.
Wieviele Parameter hat die Funktion is_prime?
Teiler-Test:
Eine Funktion, die herausfindet (zurückgibt), ob eine Zahl t ein Teiler ist der Zahl n.
Wieviele Parameter hat die Funktion is_divisor?
Auftrag zu Primzahlen
Hinweise
Schreibe zuerst die Funktion is_divisor und teste sie:
Wie finden wir heraus, ob
t ein Teiler von
n ist? Können wir das mit einer einzelnen Berechnung tun statt als
Schleife?
-
Welche Operation könnte praktisch sein, um die Teilbarkeit zu entscheiden?
Hinweis 2: t teilt n genau dann, wenn der Rest der Division $\frac{n}{t}$ null ist…
Schreibe is_prime erst, wenn is_divisor funktioniert.
Zusatzauftrag:
Aufgabe M3: Primfaktorzerlegung
Jede positive natürliche Zahl kann geschrieben werden als Multiplikation von Primzahlen. Diese Primfaktorzerlegung (PFZ) ist eindeutig.
Bsp. Primfaktoren für $45$ sind: $3,3,5$ (weil: $3\cdot3\cdot5 = 45$)
Primfaktorzerlegung ist extrem wichtig z.B. für Verschlüsselungsalgorithmen
Schreibe eine Funktion prime_factors(x), die eine Zahl x entgegennimmt und deren (geordnete) Primfaktoren von x ausgibt.
Weitere anspruchsvolle Algorithmen
Aufgabe M4: ggT bestimmen
Aufgabe M5: Quadratwurzel ziehen