Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:algorithmen_ii [2024-10-21 11:42] – [Aufgabe A1: Maximum] hof | gf_informatik:algorithmen_ii [2024-12-16 11:19] (aktuell) – [Auftrag zu Primzahlen] hof | ||
---|---|---|---|
Zeile 27: | Zeile 27: | ||
return max2(max2(a, | return max2(max2(a, | ||
- | print(max3(input(' | + | print(max3(int(input(' |
</ | </ | ||
++++ | ++++ | ||
Zeile 35: | Zeile 35: | ||
* Teil 1: Drei Zahlen sollen eingegeben werden und danach in absteigender Reihenfolge der Grösse ausgegeben werden. | * Teil 1: Drei Zahlen sollen eingegeben werden und danach in absteigender Reihenfolge der Grösse ausgegeben werden. | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
<code python> | <code python> | ||
Zeile 89: | Zeile 89: | ||
===== Mathematische Algorithmen ===== | ===== Mathematische Algorithmen ===== | ||
- | |||
- | ==== Primzahlen ==== | ||
- | === Theorie === | ||
- | |||
- | * Was ist eine Primzahl? | ||
- | * Wenn nötig: Nachlesen auf [[wpde> | ||
- | * Primzahl-Test: | ||
- | * Eine Funktion, die herausfindet (_zurückgibt_), | ||
- | * Wieviele Parameter hat die Funktion `is_prime`? | ||
- | * Teiler-Test: | ||
- | * Eine Funktion, die herausfindet (_zurückgibt_), | ||
- | * Wieviele Parameter hat die Funktion `is_divisor`? | ||
- | |||
- | === Auftrag zu Primzahlen === | ||
- | |||
- | * in 2er-Gruppen auf Papier (kein Python!) | ||
- | * Vorgehen: | ||
- | * Algorithmus überlegen, in 2er-Gruppe besprechen, | ||
- | * Mit Lehrperson besprechen | ||
- | * In Python: Funktion `is_prime(n)` implementieren | ||
- | * Fertig? siehe Zusatzauftrag und Aufgaben unten | ||
- | |||
- | ++++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 [[gf_informatik: | ||
- | * **Hinweis**: | ||
- | * 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. | ||
- | * Wie hilft uns `is_divisor` bei der Umsetzung des Primzahltests? | ||
- | ++++ | ||
- | |||
- | **Zusatzauftrag: | ||
- | |||
- | * Wie kannst du den Algorithmus optimieren? Mache einen Plan und diskutiere diesen mit der Lehrperson. | ||
- | * Schreibe eine optimierte Version der Funktion unter dem Namen `is_prime_2` | ||
- | |||
- | |||
- | <nodisp 1> | ||
- | ++++Lösung: | ||
- | <code python> | ||
- | import math | ||
- | |||
- | def is_divisor(dividend, | ||
- | """ | ||
- | return dividend % divisor == 0 | ||
- | |||
- | def is_prime(n): | ||
- | """ | ||
- | if n < 2: | ||
- | return False | ||
- | i = 2 | ||
- | # Es reicht, bis zur Wurzel von n zu testen - gäbe es einen grösseren Teiler t so dass | ||
- | # t*x == n, dann müsste x kleiner sein als Wurzel(n) und wir hätten x bereits gefunden. | ||
- | while i <= math.sqrt(n): | ||
- | if is_divisor(n, | ||
- | # Wir haben einen Teiler gefunden -> keine Primzahl, beenden. | ||
- | return False | ||
- | i = i + 1 | ||
- | # Keinen Teiler gefunden -> wir haben eine Primzahl! | ||
- | return True | ||
- | </ | ||
- | ++++ | ||
- | </ | ||
==== Aufgaben B ==== | ==== Aufgaben B ==== | ||
Zeile 165: | Zeile 101: | ||
- Ganzzahldivision mit Rest mit Addition und Subtraktion | - Ganzzahldivision mit Rest mit Addition und Subtraktion | ||
- Entscheiden ob eine beliebige Zahl eine Zweierpotenz ist oder nicht | - 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? | ||
+ | ++++ | ||
<nodisp 1> | <nodisp 1> | ||
Zeile 245: | Zeile 188: | ||
</ | </ | ||
- | ==== Anspruchsvolle Algorithmen | + | ==== Primzahlen |
+ | === Theorie === | ||
+ | |||
+ | * Was ist eine Primzahl? | ||
+ | * Wenn nötig: Nachlesen auf [[wpde> | ||
+ | * Primzahl-Test: | ||
+ | * Eine Funktion, die herausfindet (Also `True` oder `False` _zurückgibt_), | ||
+ | * Wieviele Parameter hat die Funktion `is_prime`? | ||
+ | * Teiler-Test: | ||
+ | * Eine Funktion, die herausfindet (_zurückgibt_), | ||
+ | * Wieviele Parameter hat die Funktion `is_divisor`? | ||
+ | |||
+ | |||
+ | === Auftrag zu Primzahlen === | ||
+ | |||
+ | * in 2er-Gruppen auf Papier (kein Python!) | ||
+ | * Vorgehen: | ||
+ | * Algorithmus für Primzahltest überlegen, in 2er-Gruppe besprechen, | ||
+ | * Mit Lehrperson besprechen | ||
+ | * In Python: Funktion `is_prime(n)` implementieren | ||
+ | * Fertig? siehe Zusatzauftrag und Aufgaben unten | ||
+ | |||
+ | ++++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 [[gf_informatik: | ||
+ | * **Hinweis**: | ||
+ | * 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. | ||
+ | * Wie hilft uns `is_divisor` bei der Umsetzung des Primzahltests? | ||
+ | ++++ | ||
+ | |||
+ | **Zusatzauftrag: | ||
+ | |||
+ | * Wie kannst du den Algorithmus optimieren? Mache einen Plan und diskutiere diesen mit der Lehrperson. | ||
+ | * Schreibe eine optimierte Version der Funktion unter dem Namen `is_prime_2` | ||
+ | |||
+ | |||
+ | <nodisp 2> | ||
+ | ++++Lösung: | ||
+ | <code python> | ||
+ | import math | ||
+ | |||
+ | def is_divisor(dividend, | ||
+ | """ | ||
+ | return dividend % divisor == 0 | ||
+ | |||
+ | def is_prime(n): | ||
+ | """ | ||
+ | if n < 2: | ||
+ | return False | ||
+ | i = 2 | ||
+ | # Es reicht, bis zur Wurzel von n zu testen - gäbe es einen grösseren Teiler t so dass | ||
+ | # t*x == n, dann müsste x kleiner sein als Wurzel(n) und wir hätten x bereits gefunden. | ||
+ | while t <= math.sqrt(n): | ||
+ | if is_divisor(n, | ||
+ | # Wir haben einen Teiler gefunden -> keine Primzahl, beenden. | ||
+ | return False | ||
+ | t = t + 1 | ||
+ | # Keinen Teiler gefunden -> wir haben eine Primzahl! | ||
+ | return True | ||
+ | </ | ||
+ | ++++ | ||
+ | </ | ||
=== Aufgabe B3: Primfaktorzerlegung === | === Aufgabe B3: Primfaktorzerlegung === | ||
Zeile 275: | Zeile 282: | ||
while is_divisor(remainder, | while is_divisor(remainder, | ||
remainder = remainder / factor | remainder = remainder / factor | ||
- | print factor | + | print(factor) |
# yield factor | # yield factor | ||
| | ||
Zeile 281: | Zeile 288: | ||
factor = next_prime(factor) | factor = next_prime(factor) | ||
- | prime_factors(input()) | + | prime_factors(int(input())) |
</ | </ | ||
++++ | ++++ | ||
</ | </ | ||
+ | |||
+ | ==== Weitere anspruchsvolle Algorithmen ==== | ||
=== Aufgabe B4: ggT bestimmen === | === Aufgabe B4: ggT bestimmen === | ||
Zeile 313: | Zeile 322: | ||
* Schreibe eine Funktion `wurzel(x)`, | * Schreibe eine Funktion `wurzel(x)`, | ||
- | < | + | < |
++++Lösung: | ++++Lösung: | ||
<code python> | <code python> |