Schreiben Pow-Funktion Ohne Mathematik.h in C
Hi ich will mir schreiben ein code für eine pow-Funktion ohne Verwendung von math.h libary.
Wie ist dieser code?wie kann ich es beheben, wenn b<0
int MyPow(int a,int b){
if(b<0)
return 1 / MyPow (a,-b)
else if(b==0)
return 1;
else if(b==1)
return a;
else
return a*MyPow(a,b-1)
}
- was ist das Problem?
- was passiert, wenn
b<0
? - linux-system, das Schreibe ich da nicht mit Mathematik.h
- das ist nicht das Problem... was er meint ist 'Was ist dieser code tun, dass abweichend von Ihren Erwartungen?', "Was will er zurückkehren, und was sollte Sie zurück', diese Art der Sache.
- math.h ist ein standard-header, Frage ich mich, warum es nicht verfügbar war ?
- Ich denke, Sie sollten überprüfen
if (a==0) { return 0; }
undif (b==0||a==1) { return 1; }
undif (b==1) { return a; }
und endlichreturn myPow(a*a, b/2) * ((b%2==0) ? 1 : a);
- Ich habe nur gefragt, ob seine gute Funktion pow und wie kann ich aktualisieren diese Funktion
- Als Anregung, versuchen Potenzierung von Quadratur-Algorithmus, siehe en.wikipedia.org/wiki/Exponentiation_by_squaring. Es ist viel schneller
O(log2(n))
als "naive" Methode. Dies kann Ihnen beibringen, die Rekursion als gut. - Diese Frage scheint off-topic, weil es um code-review und migriert werden sollen, codereview.stackexchange.com
- neu-besuchen Sie meinen code! Ich habe aktualisiert, wie es enthielt ein kleiner Schönheitsfehler! Bitte re-Bearbeiten Sie Ihren code!
- Wenn
b < 0
, dann wird das Ergebnis nichtint
. Pow(1, -2) von 0,25. Also ohne änderung der Rückgabetyp ist es nicht wirklich möglich, alles zurückzugeben, was nützlich fürb<0
. - Mögliche Duplikate von Wie kann ich Schreibe eine power-Funktion selbst?
- Der ursprüngliche code hatte keinen Zweig für
b<0
so würde es wahrscheinlich verursachte einen stacküberlauf (tail-Rekursion Optimierung hier nicht möglich ist!)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alles scheint perfekt, mit Ausnahme einer Bedingung :-
when b<0
.Für b<0,einfach wieder
ODER
Auch,Ihre definition der Funktion ist nicht gültig für die Durchführung von negativen Potenzierung,sollten Sie es ändern, um
1/MyPow(a,-b)
wird0
fast immer (es sei dennb==1
, und dann wäre es1
).int
. Integer-division von1
durchsomething
zurück0
wennsomething
ist alles andere als1
oder0
.Wohl am besten, denke ich, finden Sie hier
O(log(exp))
. Beachten Sie, dass es nicht Fälle behandelt werden, woexp < 0
.exp < 0
ohne Kompromisse bei der Komplexität?int
mit einem negativen Exponenten ist unsinnig, da das Ergebnis auf 0 abgeschnitten. Ansonsten, das ist die normale Lösung, um einen negativen Exponenten ist:return 1.0/pow(base, -exp)
Eine Lösung mit weniger Aufwand entnommen http://www.geeksforgeeks.org/write-a-c-program-to-calculate-powxn/