Bin neu versteh es nicht ganz
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
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)
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)
@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.
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.
@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.
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.
Man ist schon recht schnell an der Grenze. Hier ist sowohl a*a als auch a*a+1 angeblich eine Quadratzahl:
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 = 123456789
In [2]: (a*a)**0.5
Out[2]: 123456789.0
In [3]: (a*a+1)**0.5
Out[3]: 123456789.0
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