Super Pow--C++ Clean and Short Solution

关于Leetcode中的Super Pow 一题有几种不同的解法,在Leetcode的discuss板块中,我发现了一种很棒的解题思路,顺便翻译一下(加深记忆)。

作者:fentoyal
地址:C++ Clean and Short Solution

翻译如下

同余模定理: ab%k=(a%k)(b%k)%k

由于幂存放在数组中,我们最好将它一位一位的处理。

通过观察可知:(其实为了便于理解可以先将取模的过程去掉,这里保留原式子)
a1234567%k=(a1234560%k)(a7%k)%k=(a123456%k)10%k(a7%k)%k

看起来有点复杂?让我们采取另一种表达方式:
假设 f(a,b) 表示计算 ab%k 然后利用该函数表示上面的公式:
f(a,1234567)=f(a,1234560)f(a,7)%k=f(f(a,123456),10)f(a,7)%k

代码实现如下:

class Solution {
    const int base = 1337;
    int powmod(int a, int k) //a^k mod 1337 where 0 <= k <= 10
    {
        a %= base;
        int result = 1;
        for (int i = 0; i < k; ++i)
            result = (result * a) % base;
        return result;
    }
public:
    int superPow(int a, vector<int>& b) {
        if (b.empty()) return 1;
        int last_digit = b.back();
        b.pop_back();
        return powmod(superPow(a, b), 10) * powmod(a, last_digit) % base;
    }
};

Note: 这种方法显然不是最快的,但是当我们在面试中被问到这个问题时可以很快的理解并写出。还有这个方法没有使用内建的pow函数,我想这也是面试官所期待的。
希望它对你有帮助!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值