【分治】快速幂

题目要求

计算\(a^n\) % b,其中a,b和n都是32位的非负整数。

思路解析

这道题要考虑两个问题,第一个问题是时间复杂度问题,另一个问题是大数的精度问题。
为了解决时间复杂度问题,若n为偶数,我们每次把\(a^n\)的n减少一半;若n为奇数,我们先把n减掉1,给result乘一个底数a,然后再继续减少一半。
为了解决精度问题,不能把取余数的操作放在最后做,而应该每一步操作进行一次取余数。

要注意的点

  • 时间复杂度
  • 精度

Java实现

public class Solution {
    /**
     * @param a: A 32bit integer
     * @param b: A 32bit integer
     * @param n: A 32bit integer
     * @return: An integer
     */
    public long longPower(long a, long b, long n) {
        long result = 1;
        if(n == 0) {
            return 1 % b;
        }
        if(n == 1) {
            return a % b;
        }
        while(n > 0) {
            if (n % 2 != 0) {
                n = n - 1;
                result = result * a % b;
            }
            a = a * a % b;
            n = n / 2;
        }
        return result;
    }

    public int fastPower(int a, int b, int n) {
        // write your code here
        return (int)longPower(a, b, n);
    }
}
posted @ 2020-04-19 22:15  アカツキ  阅读(97)  评论(0编辑  收藏  举报