[解题报告]《算法零基础100讲》(第15讲) 二分快速幂

简介: [解题报告]《算法零基础100讲》(第15讲) 二分快速幂

零、写在前面


        这是打卡的第十五天,其中最后一道题之前有写过,今天再次进行一个优化,主要知识点在


《算法零基础100讲》(第15讲) 二分快速幂

https://blog.csdn.net/WhereIsHeroFrom/article/details/121134510


一、主要知识点


       1.二分快速幂


       主要利用到的思想就是如下的样子,非常便于理解,


      image.png


#define ll long long
ll f(ll a, ll b, ll c) {
    if (b == 0)
        return 1 % c;           //0次幂是1
    ll v = f(a*a % c, b/2, c);  //二分运算
    if (b % 2)
        v = v * a % c;          
    return v;
}

       2.二分快速幂的非递归实现(补充知识点)


       其实使用递归肯定是可以的,但是,为了优化空间复杂度以及常数级别的时间复杂度,我们可以考虑这个非递归实现。这两个思想其实是一个从前往后,但是递归返回的时候是从1开始往回传值,最终得到结果的。为了方便理解,我换了一种方式大家看一下这个动画加深一下理解,希望大家可以熟练寻用。


    image.png


int kuaisumi(int a, int k){
    int ans = 1;
    a %= mod;
    while(k){
        if(k&1) ans = (ans*a)%mod;//如果当前位为1 则乘a
        a = (a * a) % mod;        //a变成之前的平方
        k>>= 1;                    //k右移一位
    }
    return ans;
}

二、课后习题


50.Pow(x,n)


50. Pow(x, n)

https://leetcode-cn.com/problems/powx-n/


求一个数字的n次方,但是不能直接硬算,会超时。


主要思想


其实就是用之前的二分快速幂的非递归实现,只不过这里不需要取模,所以把取模干掉就好了。


但是,这题有个大坑,给的数字是int的边界,在转换成正数的时候会超出范围,所以,我们需要使用unsigned int进行变量的转换吸收。具体看代码把。


double myPow(double x, int n){
    double y = 1;    //保存结果
    unsigned m;    //接受n的转换结果
    if(n < 0){    //如果n<0 就把x变成1/x n变 -n 统一运算
        x = 1/x;
        m = -(unsigned int)n;
    }
    else m = n;
    while(m){            //非递归二分快速幂
        if(m&1 == 1) y *= x;
        x *= x;
        m >>= 1;
    }
    return y;
}

结果分析


image.png


还是可以的。


其实递归实现也可以 我放一个做参考


double f(double a,unsigned int n) {
    if (n == 0)
        return 1; 
    double v = f(a*a , n/2); 
    if (n % 2)
        v = v * a ; 
    return v;
}
double myPow(double x, int n){
    double y = 1;
    unsigned m;
    //if(x == 1) return y;
    if(n < 0){
        x = 1/x;
        m = -(unsigned int)n;
    }
    else m = n;
    y = f(x,m);
    return y;
}


372.超级次方


372. 超级次方

https://leetcode-cn.com/problems/super-pow/


主要思想


       主要问题其实是出现在数据的及时取余,我们这里用的是下面的递推式,就很好做运算了。


                              image.png


int mod = 1337;
int kuaisumi(int a, int k){//快速幂的实现
    int ans = 1;
    a %= mod;
    while(k){
        if(k&1) ans = (ans*a)%mod;
        a = (a * a) % mod;
        k>>= 1;
    }
    return ans;
}
int superPow(int a, int* b, int bSize){
    if(!bSize) return 1;//如果没数据返回1
    int ans ;
    ans = kuaisumi(a,b[bSize - 1])*kuaisumi(superPow(a,b,bSize - 1),10);//递归调用
    return ans%mod;
}

结果分析


image.png


凑合凑合。


1808.好因子的最大数目


1808. 好因子的最大数目

https://leetcode-cn.com/problems/maximize-number-of-nice-divisors/


这个已经做过了,题解在,说真的,这个不看血亏。你能感受到数学的魅力是多么的强大


[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(下)_XingleiGao的博客-CSDN博客

零、写在前面这是打卡的第十天,由于今天的第二题有一定的难度,需要我花费比较大的篇幅做题解,这是第二篇,主要讲解第三题。我增加了一道题作为这道题的第一步辅助理解。上一篇在[解题报告]《算法零基础100讲》(第10讲) 因子分解和枚举(上)https://blog.csdn.net/qq_17593855/article/details/121052656一、预备知识⚠这部分不是特别难,只要你能理解,你就可以很容易的写这道题整数拆分给定一个正整数n,...

https://blog.csdn.net/qq_17593855/article/details/121053105

但是。今天做个优化,就是把它优化成非递归实现,代码如下:

int mod = 1000000007;
long long kuaisumi(long long a, int k){
    long long ans = 1;
    while(k){
        if(k&1) ans = (ans * a) % mod;
        a = (a * a) % mod;
        k >>= 1;
    }
    return ans;
}
int maxNiceDivisors(int primeFactors){
    if(primeFactors == 1) return 1;
    if(primeFactors % 3 == 0) return kuaisumi(3,primeFactors/3);
    else if(primeFactors % 3 == 1) return (kuaisumi(3,primeFactors / 3 - 1)*4)%mod;
    else return (kuaisumi(3,primeFactors/3)*2)%mod;
}



image.png


就很完美0.0


三、今日总结


看到今天打卡人数骤减,不知道是太难了还是怎样,希望我的题解能给大家点思路,大家都要坚持下去呀


相关文章
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
36 2
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
38 0
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
35 0
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
29 0
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-5 算法训练 最短路
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-5 算法训练 最短路
25 0
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-3 算法训练 K好数
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-3 算法训练 K好数
30 0
|
3月前
|
算法
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-贪心算法
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-贪心算法
30 0
|
3月前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
33 1
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
41 1
|
3月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
36 0