Er hat übelst die Problem in Informatik, 11 Klasse. Ich habe es auch schon probiert, komme allerdings auch nicht klar um ihn zu helfen. Es sind vier Aufgaben, die er schreiben muß und er such jemanden, der ihn dabei hilft (es macht).
Hier sind die Programme: Blatt 1 Blatt 2
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
Zu deiner Frage: Also erstmal fand er deine Aussage nett, mit dem einfach aber interessant.
Deine Lösungsvorschläge fand er in Ordnung und richtig.
Auch wenn ich nicht gut im Erzählen bin und es auch nicht so rüberkommt, er war wirklich begeistert.
PS: Doch auf eins möchte ich noch hinweisen - Aufgabe 7_4 kann man noch weiter beschleunigen
PS-2: Wie hasst du es blos geschafft so zu denken und auf die Lösungen zu kommen ?
PS: Doch auf eins möchte ich noch hinweisen - Aufgabe 7_4 kann man noch weiter beschleunigen
PS-2: Wie hasst du es blos geschafft so zu denken und auf die Lösungen zu kommen ?
...
hm .. hatte mich im prinzip her nur auf die beschleunigung durch dieses odd und das sqrt geschraenkt .. aber wo wir schon mal dabei sind ... wie wollte ers denn beschleunigt haben ?
und zu der anderen frage .. hm keine ahnung .. die loesungen lagen doch auf der hand ... aufgabe lesen, loesung wissen, quelltext ins forum schreiben .... da muss man nicht mal gross ueberlegen .... die aufgaben waren wirklich einfach ....
naja .. vielleicht spielt da einwenig mathematisches verstaendnis und erfahrung mit hinein .. ich peogrammiere immerhin schon ueber ne dekade ^^