剑指 Offer 16. 数值的整数次方(快速幂)

在这里插入图片描述

解法:快速幂
算法解析

要考虑到特殊值和边界条件。
特殊值:
(1)底数为0,且指数为0, 0 0 0^0 00没有意义,约定结果为1。
0 0 = 1 0^0=1 00=1
(2)底数为0,且指数不为0,结果为0。
0 n = 0 0^n=0 0n=0
(3)底数为1,且指数为任意值,结果为1。
1 n = 1 1^n=1 1n=1
(4)底数不为0,且指数为0,结果为1。
x 0 = 1 x^0=1 x0=1
边界值:
(1)题目要求不考虑大数问题。忽略底数的边界。
(2)指数为负数时,可以先对指数求绝对值,再把底数取倒数。
问题在于当指数 n = − 2147483648 n=-2147483648 n=2147483648,由于n是有符号整型,最大值是2147483647,无法保存2147483648这个结果,可以用long long类型来保存。

// 判断浮点数是否相等
int fequal(double a, double b)
{
    double eps = 1e-6;
    double c = a-b > 0 ? a-b : b-a;
    return  c < eps ? 1 : 0;
}
double myPow(double x, int n){
    // 特殊值直接返回结果
    // 0^0没有意义
    if(fequal(x, 0.0) && n == 0) return 1;
    // 底数为0
    else if(fequal(x, 0.0)) return 0;
    // 底数为1, 注意浮点数x判断相等的方式
    else if(fequal(x, 1.0)) return 1;
    // 指数为0
    else if(n == 0) return 1;

    // 指数n为负
    // 当n=-2147483648,取相反数会溢出,可使用long long 来保存
    long long p = n;
    if(p<0)
    {
        p = -p;
        x = 1/x;
    }

    // 一般情况
    double r =1;
    while(p)
    {
        if(p&1)
        {
            r = r*x;
        }
        x = x * x;
        p = p >> 1;
    }
    return r;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值