Algorithmen und Programmierung Fachgebiet Telematik/Rechnernetze WS 12/13 Prof. Dr.-Ing. Günter Schäfer Übungsblatt 4 Aufgabe 1 2 Punkte N Eine Zahl n ∈ heißt perfekt oder vollkommen, wenn die Summe ihrer Teiler gleich n ist. Dabei sind die Teiler echt kleiner als n. Beispielsweise ist 6 = 1 + 2 + 3 eine perfekte Zahl. Schreiben Sie ein JAVA-Programm, das alle perfekten Zahlen bis 5000 bestimmt. Geben Sie diese an. Aufgabe 2 3 Punkte Formulieren Sie einen terminierenden Algorithmus in Pseudocode für die Division mit Rest zweier Zahlen x , y ∈ , y 6= 0 mit dem Ergebnis z und Rest r (z , r ∈ ), so daß für f (x , y) = (z , r ) gilt x = z · y + r mit 0 ≤ r < y. Zulässige Grundoperationen sind die Addition und die Subtraktion zweier beliebiger Zahlen aus sowie die Vergleichsoperationen ≤ und if ...then...else.... Der Algorithmus soll als rekursive Funktionsdefinition formuliert werden. Machen Sie plausibel, daß Ihr Algorithmus für alle erlaubten Werte terminiert. Erläutern Sie den Algorithmus an einem sinnvoll gewählten Beispiel Ihrer Wahl. N N N Aufgabe 3 2 Punkte Es gilt 11 + 22 + 33 + · · · + 1010 = 10405071317. Entwickeln Sie einen Algorithmus in Java, der die letzten 10 Ziffern der Summe P1000 i 1 2 3 1000 berechnet und geben Sie diese an. i=1 i = 1 + 2 + 3 + · · · + 1000 Aufgabe 4 2 Punkte Nach dem Gregorianischen Kalender (gilt seit 1583) wird der Wochentag aus einem beliebigen Datum nach folgender Berechnungsvorschrift ermittelt: T = J + ((J − 1) div 4) − ((J − 1) div 100) + ((J − 1) div 400) + D J: Jahr D: Tage bis zum zu berechnenden Datum T* = T mod 7 → 0: Samstag, 1: Sonntag, 2: Montag, ... , 6: Freitag Beispiel: 1. Januar 1994 D=1 T = 1994 + 498 - 19 + 4 + 1 = 2478 T* = 2478 mod 7 = 0 → Samstag a) Schreiben Sie ein Java-Programm, das für den ersten Januar eines beliebigen Jahres den Wochentag bestimmt. b) Erweitern Sie das Programm für ein beliebiges Datum. Hinweis: Schaltjahre sind alle Jahre, die durch 4 teilbar sind, mit Ausnahme der Jahre, die durch 100, aber nicht durch 400 teilbar sind. Aufgabe 5 4 Punkte Implementieren Sie das Spiel des Lebens in Java. Bei diesem Spiel entwickelt sich eine Zellmatrix von variabler Größe (n x n) rundenweise. Jede Zelle besitz einen Zustand und kann entweder tot oder lebendig sein. Eine tote Zelle beginnt zu leben wenn genau drei ihrer acht Nachbarn leben. Eine Zelle überlebt wenn zwei oder drei ihrer Nachbarn leben. Dabei kann die Matrix als Torus interpretiert werden, das bedeutet Zellen, welche sich eigentlich am Rand der Matrix befinden, haben ihre Nachbarn am gegebüberliegenden Rand. Kapseln Sie bei der Implementierung die Rundenfunktion in eine Methode boolean[][] nextGeneration(boolean[][] cells). Wie viele Runden lebt die folgende Zellmatrix bis sie wieder in einen alten Zustand wechselt? 0 1 2 3 Aufgabe 6 0 1 2 3 true true false false false false true false true true false false false true true false 6 Punkte Gegeben ist folgende Funktion q(n) für n ∈ N: q(n) = if n = 0 then 0 else q(n − 1) + n + n − 1 fi a) Welche mathematische Operation wird durch die Funktion realisiert? b) Führen Sie die Funktion für die Eingaben n=1, n=2 und n=3 aus. Vergessen Sie nicht Zwischenschritte aufzschreiben! c) Bitte formulieren Sie diese Funktion imperativ nicht-rekursiv in einer while−Schleife mit einem einzelnen Anweisungsblock: Q: var input while output do od; .