1. 问题描述:
求解出结果在Long范围内的 n 的 x 次幂
2. 思路分析:
① 使用传统计算累乘的方法时间时间复杂度O(n),我们可以对其进行优化,使用的是反复平方的方法来进行求解,反复平方的话相当于以2的指数的速度靠近x,这样的计算速度是很快的
② 因为每一次指数都是以2的倍数增长的,所以在循环中只能求解出x的偶数次幂(假设目前到的结果是x的y次幂),所以我们要对剩下来的n的x - y次幂进行求解,对于同样的问题我们可以使用递归来进行求解,在方法中把剩下来的x - y次传给递归方法求解,假如x为偶数的话,最终参数会变为零,这个时候返回1就可以了,但是求解的有可能是奇数那么最后的x的参数肯定是1那么返回自身就可以了
③ 需要注意的是我们一开始的时候要把n先进行平方,因为接下来的循环中每一次幂数都是要乘以2的,所以不能够为零,为零的话就陷入了死循环了
3. 代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt();
long res = exponent(n, x);
System.out.println(res);
sc.close();
}
private static long exponent(int n, int x) {
if(x == 0)return 1;
//因为它可能最后只剩下n的一次幂(每一次减去的都是2次方但是要求解的可能是奇数次)
//所以这也是一个出口
if(x == 1){
return n;
}
//注意这里先要乘以自己因为times作为判断不能够一开始等于零所以需要现在这里预处理一下
long res = n * n;
int times = 2;
while(times * 2 <= x){
res = res * res;
//注意下面的是乘以2而不是加2
times *= 2;
}
//递归求解
res *= exponent(n, x - times);
return res ;
}
}