Ubungen V zur Vorlesung Informatik I

Werbung
Ü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
Zugehörige Unterlagen
Herunterladen