计算 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
输入样例:
23 2 54 3 9
输出样例:
41
时间复杂度 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;}}
注意溢出问题
