计算 x``n
其中n为正整数
若n为负数,考虑转换成 1.0 / x ``(-n)
思路:将指数n转换成二进制形式
例如 x = 3, n = 7
其中n
转换成二进制形式为 0111
`x= 3
= 3``= 3
3```` 3```
public double calPow(double x, long n) {
//数学方法,将指数分解为二进制形式,根据1所在位逐一计算
//result用于记录结果
double result = 1.0;
//x_per用于倍增
double x_per = x;
while (n > 0) {
if ((n & 1) != 0) {
result *= x_per;
}
x_per *= x_per;
n >>= 1;
}
return result;
}
例题
875. 快速幂
给定 n 组 ai,bi,pi,对于每组数据,求出 aibimodpi 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含三个整数 ai,bi,p。
输出格式
对于每组数据,输出一个结果,表示 aibimodpi 的值。
每个结果占一行。
数据范围
1≤n≤100000,
1≤ai,bi,pi≤2×109
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
时间复杂度 O(log b)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while (n-- > 0) {
int a = sc.nextInt(), b = sc.nextInt(), p = sc.nextInt();
int ans = qmi(a, b, p);
System.out.println(ans);
}
}
static int qmi(long a, int b, int p) {
long res = 1;
while (b > 0) {
if ((b & 1) == 1) {
res = res * a % p;
}
a = a * a % p;
b >>= 1;
}
return (int) res;
}
}
注意溢出问题