Perfect square und perfect cube
Gibt es eine vordefinierte Funktion in c++ zu überprüfen, ob die Zahl ist Quadrat einer Zahl und der gleichen für den cube..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine vordefinierte Funktion in c++ zu überprüfen, ob die Zahl ist Quadrat einer Zahl und der gleichen für den cube..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, aber es ist einfach zu schreiben:
n / root == root
, aber ich landete mit einem anderen Ansatz. Vielen Dank für den Hinweis! Bearbeiten, beantworten.sqrt()
odercbrt()
passiert Rückkehr epsilon kleiner als der eigentlichen Wurzel, der cast auf integer schneidet, und die überprüfung schlägt fehl. Komplett Kugel-Beweis-gegen das, müssen Sie auch zu prüfen, obn == (root + 1) * (root + 1)
für die Quadratwurzel Fall, oder wennn == (root + 1) * (root + 1) * (root + 1)
für die cube-root-Fall.sqrt
odercbrt
würde am Ende zu sein "epsilon kleiner als die Wurzel"? Denken Sie daran, wir sind nicht der Umgang mit Brüchen-hier also (unter der Annahme, dass der root nicht so groß, dass es nicht exakt dargestellt werden, die durch eine floating-point-Zahl, in dem Fall haben wir bereits verloren), wie wird dies ein problem sein? Ich bin glücklich, zu verwendenround()
obwohl.abs(root-round(root)) <= epsilon
eher als Multiplikation?sqrt(x)
oder im Allgemeinenpow(x, 1./2)
oderpow(x, 1./3)
Beispiel:
Edit: oder allgemein:
pow(x, 1./3)
ist, dass 1/3 nicht eine genaue Darstellung in floating point, Sie sind also nicht "wirklich" getting the cube root. C99 ab hatcbrt
, die sollten tun, einen besseren job zu bekommen, das cube root.pow
verallgemeinert einfacher, und es ist leicht genug, um richtig für floating-point-Fehler.Versuchen Sie dies:
Nein, es gibt keine standard-c-oder c++ - Funktionen, um zu überprüfen, ob ein integer ist ein perfektes Quadrat oder ein perfekter Würfel.
Wenn Sie wollen, dass es schnell sein und vermeiden Sie die Verwendung des float - /double-Routinen erwähnt, in den meisten Antworten, dann code eine binäre Suche verwenden nur Ganzzahlen. Wenn Sie finden ein n mit n^2 < m < (n+1)^2, dann m ist kein perfektes Quadrat. Wenn m ein perfektes Quadrat, dann findest du ein n mit n^2=m. Das problem ist, diskutiert hier
Zur Identifizierung Quadrate habe ich versucht, dieses Algorithmus in java. Mit wenig Unterschiede in der syntax, die Sie tun können es in c++ auch.
Die Logik ist, die Differenz zwischen zwei aufeinander folgenden Quadratzahlen geht auf die Steigerung von 2. Diff(1,4)=3 , Diff(4,9)=5 , Diff(9,16)= 7 , Diff(16,25)= 9..... geht auf.
Wir können dieses Phänomen zu identifizieren, die perfekte Quadrate.
Java-code ist,
Machen die Identifikation von Plätzen schneller können wir verwenden ein anderes Phänomen, das rekursive Summe der Ziffern von Quadratzahlen ist immer 1,4,7 oder 9.
So viel schneller code sein kann...
Für perfektes Quadrat können Sie auch tun:
Für perfekte Würfel können Sie:
Hoffe, das hilft.
return sqrt(n)==floor(sqrt(n))
? (und warum lieberfloor
zuround
?) Dann gibt esint r = round(cbrt(n)); return n == r*r*r
- keiner von denen istpredefined
verlassen nicht zu unserer 2016 wissen: Chris' Antwort.Konnten wir das builtin truc Funktion -
Die effizienteste Antwort könnte dieser
Diese Methode funktioniert aufgrund der Tatsache, dass x ist ein int, und es wird im drop-down-Nachkommastellen zu speichern, wird nur der ganzzahlige Teil. Wenn eine Zahl perfektes Quadrat einer ganzen Zahl, deren Quadratwurzel eine ganze Zahl und somit x und sqrt(x) gleich sein.