面试题 11

1 题目描述

题目:实现函数 double Power(double base,int exponent),求exponent 次方,不得使用库函数,同时不考虑大数问题。


算法描述

base^exponent
一般情况 base>=0 exponent>=0
特殊情况 base=0 exponent<0 此时计算需要进行 /0 操作,导致错误
特殊情况 base=0 exponent=0,0^0 在数学上没有意义,可以返回 0 或者 1


C 语言实现

#include<stdio.h>
int invalidInput=0;
int equal(double base){
    if(base-0.0>-0.0000001&&base-0.0<0.0000001){
        return 1;
    }else{
        return 0;
    }
}
double powerWithUnsignedExponent(double base,int exponent){
    if(exponent==1) return base;
    if(exponent==0) return 1;
    double result=powerWithUnsignedExponent(base,exponent>>1);
    result=result*result;
    if(exponent&1==1){
       result*=base;
    }
    return result;
}
double Power(double base,int exponent){
    double result=0.0;
    if(equal(base)&&exponent<0){
        invalidInput=1;
        return result;
    }
    unsigned int absExponent=(unsigned int)exponent;
    if(exponent<0){
        absExponent = (unsigned int)(-exponent);
    }
    result=powerWithUnsignedExponent(base,absExponent);
    if(exponent<0){
        result=1/result;
    }
    return result;
}

void main(){
    printf("%f  ",Power(2,3));
    printf("%d\n",invalidInput);

    printf("%f  ",Power(2,-3));
    printf("%d\n",invalidInput);

    printf("%f  ",Power(0,-3));
    printf("%d\n",invalidInput);

    printf("%f  ",Power(0,0));
    printf("%d\n",invalidInput);
}

注意事项

1 代码完成性:功能测试、边界测试、负面测试
2 处理错误的三种方法,通常有 3 种方式将错误信息传递给调用者,函数返回值,设置全局变量和抛出异常。每一种方法都有局限,本例中使用全局变量记录错误信息。
3 使用移位操作代替 *2 操作,使用 &1 代替 奇偶数判定 操作,效率会更高。

a^n = a^(n/2) * a^(n/2)         n为偶数
a^n = a^(n-1/2) * a^(n-1/2)*a   n为奇数

4 用递归的方式可以实现 O(lgn) 时间复杂度求解 a^n。
5 由于计算机表示小数都有误差,不能直接使用等号判断两个小数是否相等,如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为他们相等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值