题目:实现函数double pow(double base,int exp),求base的exp次方,不得使用库函数,同时不需要考虑大数问题。
要求:
1、考虑base为正数、负数、0的情况,
2、考虑exp为正数、负数、0的情况,
#include<stdio.h> double double_pow_positive(double base,int exp); int equal(double num1,double num2); double double_pow(double base,int exp) { if(double_equal(base,0)==1) { if(exp<=0)return -1; else return 0; } else { if(exp>=0)return double_pow_positive(base,exp); else return 1/double_pow_positive(base,exp); } } double double_pow_positive(double base,int exp) { if(exp==0)return 0; else if(exp<0)exp=-exp; double result=1; int i=0; for(i=1;i<=exp;++i) result*=base; return result; } int double_equal(double num1,double num2) { if(num1-num2<0.0000001&&num1-num2>-0.0000001) return 1; else return 0; } int main() { double base=0; int exp=0; printf("请输入底数:\n"); scanf("%lf",&base); printf("请输入指数:\n"); scanf("%d",&exp); //printf("\n%f,%d\n",base,exp); printf("\n得到的结果是:%lf\n",double_pow(base,exp)); return 0; }
我们要考虑到特殊的情况,就是底数为0,指数为非正的情况,这时候我们返回-1,表示这样的情况下是错误的。
新颖的解法:
当然,这道题目也是有简单的解法的,就是我们对于无符号指数的时候,我们可以用这样的一个公式
n为偶数,a^n=a^(n/2)*a^(n/2)
n为奇数,a^n=a^((n-1)/2)*a^((n-1)/2)*a
这样通过递归的方法可以大大减少代码量,而且看起来比较通俗易懂。
剑指offer:数值的整数次方,布布扣,bubuko.com
原文:http://blog.csdn.net/litianpenghaha/article/details/22152025