【分治】快速幂
题目要求
计算\(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);
}
}