剑指offer:数值的整数次方

来源:互联网 发布:企业通讯录软件 编辑:程序博客网 时间:2024/05/17 07:11

题目:实现函数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

这样通过递归的方法可以大大减少代码量,而且看起来比较通俗易懂。

判断是奇数或者偶数的方法是  :exp & 1  是   1   还是   0  来判断

double PowerWithUnsignedExponent(double base,unsigned int exponent){    if(exponent==0)return 1;    if(exponent==1)return base;    double result=PowerWithUnsignedExponent(base,exponent>>1);    result*=result;    if(exponent&1)result*=base;    return result;}



PS:上面的程序有错,大家可以看运行的最后一张图片,应该得到1,但是运行错了,说明此时没有完全考虑边界情况,下面是改正后的程序

#include<stdio.h>int equalZero(double num1,double num2);double Power(double base,int exp){    double result=1;    int i=0;    if(equalZero(base,0)==1)return 0;    if(exp==0)return 0;    else if(exp>0)    {        for(i=1;i<=exp;++i)            result*=base;        return result;    }    return 1/Power(base,-exp);}int equalZero(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);    if(equalZero(base,0)&&exp<=0)printf("你输入的底数或者指数不合法!\n");    else printf("\n得到的结果是:%.4lf\n",Power(base,exp));    return 0;}


0 0
原创粉丝点击