0 Daumen
2k Aufrufe

Ich komme bei folgender Aufgabe nicht mehr weiter.


Geben Sie einen Algorithmus in Pseudocode an, der

a) diejenige natürliche Zahl bestimmt, welche der Quadratwurzel einer vorgegebenen natürlichen Zahl x am nächsten ist.

b) eine Liste mit Primzahlen erstellt, die kleiner als eine vorgegebene Zahl n sind.

Dabei seien nur die Operationen +·>, <, und ≤ erlaubt


Avatar von

"Ich komme bei folgender Aufgabe nicht mehr weiter."

Dann verrate doch mal, was Du schon zusammen hast.

zu a) bin ich noch zu keinem sinnvollen ergebnis gekommen...
zu b) nehmen wir mal an das n = 10 ist. Dann sollte zuerst eine Liste erstellt werden die alle Zahlen bis 10 enthält. Nun müssten alle Zahlen aussortiert werden die durch 2 teilbar sind, dann diejenigen die durch 3 teilbar sind und danach hat man alle Primzahlen bis 10.
Mein Hauptproblem ist, dass ich nicht genau weiß wie ich diesen Algorithmus korrekt aufschreibe, da dieses Gebiet für mich so gut wie neu ist.

Wenn Du für b) das Sieb des Eratosthenes nachbilden willst: Da findest Du mit Google leicht was in allen moeglichen Geschmacksrichtungen.

Fuer a) kannst Du einfach alle Zahlen von 0 bis x durchprobieren. Als Zustandsinformation merkst Du Dir, welche von den bis jetzt probierten Zahlen die Beste war und welchen Abstand ihr Quadrat zu x hatte.

Huebsch kurz z.B. da:

https://books.google.de/books?id=qneBCgAAQBAJ&pg=PA13

Sogar mit Korrektheitsbeweis und Laufzeitabschaetzung.

1 Antwort

0 Daumen

a) habe aus Versehen y für x geschrieben

Input(y)

x:=0

wiederhole

x:=x+1

bis x•x ≥ y

wenn 4y < 4•x•y - 4•x +1 dann x:= x-1

[ Kommentar:  x-√y > √y - (x-1)  <=> 2√y < 2x - 1 <=> 4y < 4•x•x - 4•x +1 ]

Output(x)

---------------------

b)

Input(n)

p ::= 1   [auf Primzahl zu prüfende Zahl]

wiederhole  

p:= p + 1

t := 1    [möglicher Teiler von p]

wiederhole

t := t +1

g:=1 [möglicher Gegenteiler von t]

wiederhole

a:=0  [Anzeiger für Teiler]

g := g+1

wenn p = g • t  dann a := 1

bis g = n  oder  a = 1

wenn a = 0 dann output(x)

bis t = n

bis p = n

-----------------------------

Der Algorithmus ist nicht optimiert. Man könnte als Obergrenze der Hauptschleife auch √n nehmen, wegen der Einschränkung der Operatoren "vertreten" durch den in a) berechneten Wert  x ≈ √n .Input(n) müsste dann durch den vorgeschalteten Algoritmus von a) ersetzt werden. Aber das wäre nur Maßnahme zur Laufzeitoptimierung.

Logischerweise konnte ich die - wegen der Operatoreneinschränkung sehr ungewöhnlichen  -Algoritmen nicht überprüfen. Bau sie also nicht in eine Flugzeugsteuerung ein. :-)


Avatar von 86 k 🚀

Vielen Dank für die Antwort !

Könntest Du mir eventuell sagen ob mein Gedankengang zu b korrekt ist und falls ja wie ich diesen dann korrekt aufschreibe ?

bei b) musst du mindestens alle Teiler bis √n überprüfen

Schaue vielleicht "morgen" danach. Muss auch mal schlafen :-)

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community