Bin neu versteh es nicht ganz

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Good
User
Beiträge: 7
Registriert: Dienstag 29. September 2020, 16:04

Ich bin ein Anfänger und versuche ein Programm zu erstellen welches einem sagt ob die Zahl eine Quadrat Zahl ist. Ich hab es mit versuchen wie % Zahl ==0 versucht aber hab es nicht geschafft. Wäre dankbar für eine Antwort
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Was macht eine Quadratzahl aus? Zum Beispiel, dass die Primfaktorzerlegung nur gerade Exponenten hat. Also ist der erste Schritt, eine Primfaktorzerlegung zu programmieren.
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

Hallo Good,

Sirius vorschlag erscheint mir etwas hart, da eine primfaktorzerlegung erstmal mehr kann als du brauchst.
Bevor wir zu einer Lösung kommen muss ich dir eine Frage stellen:
Ist 625 eine Quadratzahl?

Wenn du die Frage beantwortet hast, habe ich eine zweite:
Wie hast du festgestellt, dass 625 eine Quadratzahl ist?

Hier gibt es im wesentlichen zwei Lösungen, wobei die optimierung der einen zwangsweise die zweite offenbart:
1. Du testest alle Zahlen (welche in Frage kommen) aus und checkst ob: quad_zahl / zahl == zahl
Aber welche Zahlen kommen in Frage? Naja die obergrenze ist (quad_zahl)^0.5.... Das ist aber auch die Untergrenze...
Das führt zu zweiten Methode:
2. quad_zahl^0.5 == int(quad_zahl^0.5) (Die Wurzel ist eine Ganzzahl)
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@NPC: wenn man den anderen Beitrag von Good liest, dann geht es irgendwie um Primzahlen. Daher meine "Lösung".
Bei 1. ist die richtige Prüfung zahl * zahl == quad_zahl, da / keine exakte Operation ist, sondern mit Rundung, als Beispiel: 626 // 25 == 25 also ist 626 eine Quadratzahl. Ebenso ist 2 keine exakte Lösung, da auch hier mit beschränkter Genauigkeit gerechnet wird.
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

@Sirius3,

Ich hatte die andern Beiträge nicht gelesen... Upsi.
Es sollte auch keine Kritik sein. Dachte nur, dass es für einen Anfänger evtl. etwas schwierig ist.

Bei der Genauigkeit hast du natürlich in beiden Fällen recht.
1. ist sorum wie dus beschreibst besser (sollte glaube ich auch schneller laufen). Wobei der Fehler von / doch erst bei sehr großen Zahlen zum Tragen kommt oder?
2. Da hast du natürlich auch recht. Wobei es sich hier vielleicht mit einem Trick trotzdem recht flott lösen lässt. Sollte es eine quadratzahl sein, sollte man mittels numerischer Wurzelbestimmung einen Fehler < + 1 bekommen. Dann kann man ja zur Sicherheit noch die angenzende Zahle mit überprüfen (dann aber nach 1) um Rundungsfehler zu eliminieren. Wobei dies wahrscheinlich nicht im Übungsaufgaben bereich der Zahlen auftreten wird.
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Man ist schon recht schnell an der Grenze. Hier ist sowohl a*a als auch a*a+1 angeblich eine Quadratzahl:

Code: Alles auswählen

In [1]: a = 123456789

In [2]: (a*a)**0.5
Out[2]: 123456789.0

In [3]: (a*a+1)**0.5
Out[3]: 123456789.0
Es werden also viel mehr "Quadratzahlen" gefunden, als es gibt.

Jetzt könnte man natürlich die Gegenprobe machen und die Wurzel wieder quadrieren. Dann werden aber ab einer bestimmten Größe gar keine Quadratzahlen mehr gefunden:

Code: Alles auswählen

In [1]: a = 12345678901234567

In [2]: int((a * a) ** 0.5)
Out[2]: 12345678901234568
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

@Sirius3 Hmm, das hatte ich nicht so flott erwartet.. Danke für die Klärung :)
Antworten