Écrire la Fonction Pow Sans mathématiques.h en C
Salut, je veux écrire un code pour la fonction pow sans l'aide des mathématiques.h bibliothèque.
Comment est ce code?comment puis-je résoudre ce problème lorsque 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)
}
- quel est le problème?
- ce qui se passe quand
b<0
? - système linux que j'écris là n'ont pas de Mathématiques.h
- ce n'est pas la question... ce qu'il signifie est " qu'est-Ce que ce code fait qui s'écarte de vos attentes?', "Qu'est-ce qu'il revienne, et que devrait-il le retour", ce genre de chose.
- les mathématiques.h est un en-tête standard, je me demande pourquoi il n'était pas disponible ?
- Je pense que vous devriez vérifier
if (a==0) { return 0; }
etif (b==0||a==1) { return 1; }
etif (b==1) { return a; }
et finalementreturn myPow(a*a, b/2) * ((b%2==0) ? 1 : a);
- J'ai juste demandé si sa bonne fonction de pow et comment puis-je mettre à jour cette fonction
- Comme une suggestion essayer d'exponentiation par la quadrature de l'algorithme, voir en.wikipedia.org/wiki/Exponentiation_by_squaring. C'est beaucoup plus rapide
O(log2(n))
que "naïve" de la méthode. Cela peut vous enseigner la récursivité ainsi. - Cette question semble être hors-sujet parce que c'est sur la révision du code et doit être migré vers codereview.stackexchange.com
- re-visitez mon code! J'ai mis à jour, car il contenait un défaut mineur! S'il vous plaît re-modifier votre code!
- Si
b < 0
, alors le résultat n'est pasint
. Pow(1, -2) est de 0,25. Ainsi, sans changer le type de retour n'est pas possible de retourner quelque chose d'utile pourb<0
. - Double Possible de Comment puis-je écrire une fonction de puissance moi-même?
- Le code d'origine n'avait pas de branche pour
b<0
de sorte qu'il serait le plus susceptible d'avoir causé un débordement de pile (récursion sur la queue de l'optimisation n'est pas possible ici!)
Vous devez vous connecter pour publier un commentaire.
Tout semble parfait, sauf pour une seule condition :-
when b<0
.Pour b<0,il suffit de retourner
OU
Aussi,votre définition de la fonction n'est pas valide pour l'exécution négatif d'exponentiation,vous devez la modifier pour
1/MyPow(a,-b)
sera0
presque toujours (saufb==1
, et puis il serait1
).int
. Division entière de1
parsomething
sera de retour0
sisomething
est rien mais1
ou0
.Probablement le meilleur, je pense, trouvé ici
O(log(exp))
. Notez qu'il ne gère pas les cas oùexp < 0
.exp < 0
sans compromettre la complexité?int
, à l'aide d'un exposant négatif est dénué de sens, puisque le résultat sera tronqué à 0. Sinon, la solution normale d'un exposant négatif est:return 1.0/pow(base, -exp)
Une solution avec moins de complexité prises de http://www.geeksforgeeks.org/write-a-c-program-to-calculate-powxn/