Die aufgaben sind alle recht einfach und zudem noch sehr interessnt ..
ich reisse mal hier die loesungen kurz an
Aufgabe 7_1
Das kgv von a und b ist die kleinste zahl, die sowohl a als auch b als teiler hat .. daher koennte man folgendermassen vorgehen
Erklaehrung ... solange result bei der division durch a einen rest ungleich 0 gibt oder analog bei b, so ist die zahl nicht durch a und b teilbar ... somt erhoehen wir um 1 ... und da wir bei 1 beginnen, tasten wir uns von unten an das kgv heran
man koennte die ganze sache beschleunigen, wenn man vorher ueberprueft, ob a oder b kleiner ist und dann statt mit 1 mit dem kleineren der beiden werte angngen lassen zu zaehlen, da ein kgv nie kleiner als a und b sein kann
Aufgabe 7_2
Hierbei liegt das Problem darin, das die zahlen so lang sind, das sie nicht mehr in ein integer passen ...
es gibt mehere loesungen ...
man koennte veruchen, die zahlen als real zu speichern .. aber das wird wahrscheinlich nicht ausreichen ...
auf neueren compilern gibt es auch 64 bit integer typen .. aber die unterstuetzt TP noch nicht ...
die sicherste moegliechkeit ist, die zahlen als strings zu speichern und die bereechnungen selber zu uebernehmen ...
dazu verwendet man am besten die regeln fuer die schriftliche addition / subtraktion / multiplikation, die dir ja gelaeufig sein sollten ...
dann musst du den kuerzeren string mit nullen am anfang auffuellen, das beide die selbe laenge haben
und dann liest du die strings von rechts nach links aus und betrachtest die einzelnen zeichen als ziffern (val und str helfen hier sicherlich oder du rechnest per ord und chr um)
das ganze packst du in eine forschleife ...
das ganze machst du analog fuer die subtraktion und die multiplikation .. wobei die multiplikation etwas kniffliger wrden koennte und du vielleicht zum zwischenspeichern der strings eine textdatei verwenden solltest
Aufgabe 7_3
diese aufgabe besteht aus zwei teilabschnitten .. a) dem ermitteln der teiler (wieder mit mod) und dere aufsummieren und vergleichen mit der zahl selber ...
das ganze sieht dann so aus
Aufgabe 7_4
Der trick der verkuerzung ist folgender:
1) Da jede gerade zahl durch 2 teilbar ist, kann sie keine primzahl sein.
2) Da eine Primzahl nur durch 1 und sich selbst teilbar ist kommen nur die zahlen, die kleiner als die wurzel der zahl sind als teiler in frage, da wenn der teiler groesser als die wurzel waere, er als zweiten faktor eine zahl brauchte, die kleiner als die wurzel ist
daher ergibt sich folgende aenderung:
die zeile pz:=TRUE; aendern wir in pz:=Odd(zahl) or (zahl=2);
damit wird erst gar nicht nach teilern gesucht, wenn die zahl gerade ist
zudem koennen wir eine weitere beschleunogung vornehmen, indem wir die zeile inc(probenteiler) in inc(probenteiler,2) umaendern .. da eine ungerade zahl nie eine gerade zahl als teiler haben kann, muessen wir nur auf ungerade zahlen als teiler testen .. und die erhaellt man, indem man zu einer ungeraden zahl (probenteiler:=1) immer 2 addiert
um bedingung 2) zu erfuellen reicht es aus, die bedingung der repeatschleife zu aendern in
UNTIL (Probeteiler>=sqrt(zahl)) OR not(PZ);
damit waeren wir fertig mit der bechleunigung
zudem hat das vorgegebene programm einen schoenheitsfehler und einen bug:
die zeile Probeteiler:=-1; gleich an anfang hat keinerlei funktion und kann entfallen ... und 1 ist laut definition KEINE primzahl und dennoch gibt das programm bei 1 TRUE zurueck ... dies laesst sich durch eine eifache aenderung beheben :
pz:=(odd(zahl) AND (zahl<>1)) or (zahl=2);
die ausgabe aller primzahlen bis 10000 laesst sich in einer einfachen forschleife realisieren bzw schneller ueber eine repeat until schleife
fuer den abstand zwischen den primzahlen zaehlt man einfach bei der ueberpruefung mit, wieoft keine primzahl seit der letzten primzahl auftauchte
So das wars .. hoffe, ich konnte dir etwas weiterhelfen ...
Fuer Bugs, tippfehler und Richtigkeit wird wie immer keinerlei haftung uebernommen. Alle texte sind NICHT getestet und frei aus dem gefaechtnis geschrieben