Übungen V zur Vorlesung Informatik I Prof. Dr. Nikolaus Wulff Zum 7. November. 2007 1 kgV und ggT Aufgabe Entwicken Sie eine Methode kgV(a,b) zur Bestimmung des kleinsten gemeinsamen Vielfachen zweier Zahlen a, b ∈ N \ {0}. Es gilt die Beziehung kgV(a, b) · ggT(a, b) = a·b ∀a, b ∈ N \ {0}. (1) Tip Es gibt verschiedene Methoden den kgV und ggT zu bestimmen, eine ist die Primfaktorzerlegung. Einfacher ist es jedoch eine der beiden Methoden effektiv zu implementieren und dann die jeweils fehlende durch Umformung von Formel 1 zu ermitteln. Der ggT wird Gegenstand einer der nächsten Vorlesungen sein, daher wird in dieser Übung das kgV implementiert. Es geht darum eine einfache Methode zur Bestimmnug des kgV zu entwickeln. Um eine Lösungsidee für den gesuchten Algorithmus zu entwickeln, dient die folgende Überlegung: Für a, b ∈ N \ {0} gibt es den kgV(a, b) und daher gilt ∃ m, n ∈ N mit kgV(a, b) = m·a=n·b ⇒ ⇔ m · a mod b ≡ 0. ma = n Rest 0 b (2) (3) D.h. es gilt nur noch das minimale m zu finden, das Formel (3) erfüllt, was leicht in Form einer Schleife zu implementieren ist: 1. Begin mit m = 1. 2. Berechne den Rest von m · a geteilt durch b. 3. Ist der Rest 0 so ist m · a das gesuchte kgV. 4. Falls nicht so erhöhe m um 1 und gehe zu Schritt 2. Verwenden Sie den Modulo Operator % und eine geeignete Abbruchbedingung für die verwendete for- oder while-Schleife. 1 2 Binäre Operatoren Aufgabe Berechnen Sie für die short Variablen x,y,z mit den Vorbelegungen x = 4 und y = 7 die folgenden Ausdrücke: z z z z = = = = x x x x << 3; & ~y; | y; ^ y; Tip Schreiben Sie sich die Zahlen in Binärdarstellung untereinander und verwenden Sie dann die boolsche Algebra. 2 3 Polynom /** polynom.h */ #ifndef __POLYNOM_H #define __POLYNOM_H /** * double x the point to evaluate the polynom * int n degree of the polynom * double[] a array with the polynom coefficients * return polynom value at point x */ double polynom(double x, int n, double a[]); #endif /* __POLYNOM_H defined */ Aufgabe Entwickeln Sie eine Methode polynom, die den Wert eines Polynoms Pn (x) vom Grade n an beliebiger Stelle x auswertet: Pn (x) := n X ak xk (4) k=0 Die n+1 Koeffizienten {a0 , a1 , · · · , an } des Polynoms werden im Feld a abgelegt, d. h. die ak werden von 0 bis n gezählt. Tip Ein Problem stellen die Ausdrücke xk innerhalb der Formel da. Die k-te Potenz von x jedesmal neu zu berechen ist eine Verschwendung von Rechenzeit. Es soll daher weder die noch unbekannte Bibliotheksfunktion pow noch eine eigene Implementierung verwendent werden. Am Einfachsten lassen sich die Potenzen xk mit einer Hilfsvariablen double xk=1; berechnen, die innerhalb der Schleife mit xk *=x; in die k-te Potenz erhoben wird, d.h. xk ergibt sich quasi automatisch ”just in time” bei der Schleifenabarbeitung. Alternativ ist es auch möglich ohne diese Potenzen von xk zu rechnen, indem wie folgt geklammert wird: Pn (x) = an xn + an−1 xn−1 + · · · + a1 x + a0 ≡ (((an x + an−1 )x + · · ·)x + a2 )x + a1 )x + a0 (5) Letzte Formel liefert einen einfacheren Algorithmus zur Auswertung des Polynoms ohne explizite Berechnung der Potenzen xk , analog zum Hornerschema. Versuchen Sie in der Übung beide Methoden zu verstehen und sich herzuleiten. Bemerkung Lassen Sie sich nicht durch die ”merkwürdigen” #ifndef und #endif Anweisungen in der Headerdatei polynom.h irritieren. Deren Bedeutung wird im Laufe der Vorlesung noch klar. Was für Sie zählt ist die Signatur der Polynom Methode, die als double polynom(double x, int n, double[] a); angegeben ist. Dies ist noch nicht die Implementierung, beschreibt jedoch verbindlich wie die zu implementierende Schnittstelle aussieht. 3