【分治】快速幂
题目要求
计算\(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);
    }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号