Leecode刷题---求幂&超级次方


本文是《算法零基础100讲》(第15讲) 二分快速幂中所涉及课后习题的解答,发帖来记录自己关于这些题的理解和做题过程中思路,如果有错误,欢迎批评指正。
1.Pow(x,n)
题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n)。

主要思路:
利用递归的方法,每次判断指数的奇偶性,若为奇数,则可递归调用Mypow(x*x,n/2)x,若为偶数,则可递归调用Mypow(xx,n/2),最后在返回前判断初始的指数是否为负数,若为负数,则需要使用1.0去除上面得到的结果以得到最终解。

class Solution {
public:
    double myPow(double x, int n) {
        double ans=x;
        int n1=abs(n);
        if(n==1){
            return x;
        }
        if(n==-1){
            return 1.0/x;
        }
        if(n1==0){
            return 1.0;
        }
        return n>0? (n1%2?myPow(ans*ans,n1/2)*ans:myPow(ans*ans,n1/2)):1.0/(n1%2?myPow(ans*ans,n1/2)*ans:myPow(ans*ans,n1/2));
    }
};

2.超级次方
题目:你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
例如:
输入:a = 2, b = [1,0]
输出:1024

主要思路:
本题也是利用递归的方法,只不过由于所给的指数数组中的数会很大,所递归地每次从数组末尾往开头拿数,对superpow(3,1999),它等同pow(3,9)*superpow(3,1990)=pow(3,9)*pow(superpow(3,199),10)。
其次,由于幂会很大,需要进行取模运算,对于取模运算,有公式:(a * b) % k = (a % k)(b % k) % k。

class Solution {
public:
    int MOD=1337;
    int mypow(int a,int x){
        if(x==0){
            return 1;
        }
        a%=MOD;
        if(x%2){
            return (a*mypow(a,x-1))%MOD;
        }else{
            int temp=mypow(a,x/2);
            return (temp*temp)%MOD;
        }
    }
    int superPow(int a, vector<int>& b) {
        if(b.empty()){
            return 1;
        }
        int back=b.back();
        b.pop_back();
        int ans1=mypow(a,back);
        int ans2=mypow(superPow(a,b),10);
        return (ans1*ans2)%MOD;
    }
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值