《算法零基础》第15讲:二分快速幂 前两题题解

前言

文章参考自:《算法零基础100讲》第15讲

概念

二分快速幂本质是 分治思想。
对于表达式
在这里插入图片描述

可以分解成以下三种情况求解:
在这里插入图片描述

示例
比如计算 n ^ 16, 那计算过程就为:
n ^ 16 -> n ^ 8 -> n ^ 4 -> n ^ 2 -> n;

若要计算 n ^ 37, 计算过程为:
n ^ 37 -> n ^ 18 -> n ^ 9 -> n ^ 4 -> n ^ 2 -> n

LeetCode 50.pow(x, n)

原题链接:pow(x, n)

在这里插入图片描述

代码

快速幂,递归方法

static double Pow(double x, long long n)
{   
    if (n == 1) return x;

    double tmp = Pow(x, n / 2);
    double ans = 0.0;
    if (n % 2 != 0)
    {
        ans = tmp * tmp * x;
    }
    else
    {
        ans = tmp * tmp;
    }
    return ans;
}

double myPow(double x, int n)
{
    double ans = 1.0;
    if (n == 0 || x == 1) return ans;

    long long N = n;
    //当n小于0时,讲问题转化为求 n > 0
    if (n < 0)
    {
        ans = 1.0 / Pow(x, -N);
    }
    else
    {
        ans = Pow(x, N);
    }
    return ans;
}

在这里插入图片描述

LeetCode 372.超级次方

原题链接: 超级次方

在这里插入图片描述

代码

int my_pow (int base, int n, int mod)
{
    int res = 1;
    while (n) 
    {
        base %= mod;
        if (n & 1)
        res *= base;

        base *= base;
        n >>= 1;
    }
    return res % mod;
}

int superPow(int a, int* b, int bSize)
{
    int res = 1,  mod = 1337;
    for (int i = bSize - 1; i >= 0; --i)
    {
        if (b[i])
        {
            res *= my_pow (a, b[i], mod);
            res %= mod;
        }
        a = my_pow (a, 10, mod);
    }
    return res;
}

在这里插入图片描述

LeetCode 1808.好因子的最大数目

原题链接: 好因子的最大数目

还没写,链接挂着以防找不到。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_索伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值