[leetcode-372]Super Pow(java)

思路:这道题实际是求a^b mode c的结果,因为大数取模时具有如下特征:a^b mod c = (a mod c)^c,也就是说在任何时候取模都可以。
那么我们可以计算出前10个数的计算结果,即a^0 mod 1337,,,,a^10 mod 1337。并保持到数组中。
然后对于指数b = b’ * 10 + b”,即a^b = a^(b’10 + b”) = (a^10) ^ b’ a^b” mod 1337。而这里a^10已经计算出来了,a^b”也包含在数组里面。然后我们注意到(a^10,b’)完全可以递归计算。

代码如下:

public class Solution {
    public int superPow(int a, int[] b) {
        if(a == 1 || b.length == 0)
            return 1;
        a = a % 1337;
        int[] nums = new int[11];
        int prev = 1,i = 0;
        while(i <= 10){//至于为什么是10,因为更多的话会浪费空间,更小的话,会增加递归层数,至于10是否最优,没有测量。
            nums[i++] = prev;
            prev = prev * a % 1337;
        }

        int[] divisor = new int[b.length - 1];
        int remainder = divide(b,10,divisor);

        return superPow(nums[10],divisor)*nums[remainder]%1337;
    }

    private int divide(int[] num,int baseNum,int[] divisor){
        System.arraycopy(num,0,divisor,0,divisor.length);

        return num[num.length - 1];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值