本文共 1400 字,大约阅读时间需要 4 分钟。
计算x的n次幂,可以通过以下步骤实现:
快速幂法:通过不断将指数n除以2,并将底数x平方后乘到结果中。如果在这个过程中指数n为奇数,则在结果中再乘以底数x,同时调整指数n的值。当指数n为0时,过程结束,返回结果。
处理负指数:如果n为负数,将x转换为倒数,并将n转换为正数进行计算。
数据类型选择:由于n的取值范围较大(-2^31 <= n <= 2^31 - 1),为了避免溢出问题,可以将n存储为长整型(long)。
public class Solution { public double myPow(double x, int n) { if (n == 0) { return 1; } long b = n; if (n < 0) { x = 1.0 / x; b = -b; } double result = 1.0; while (b != 0) { if (b % 2 == 1) { result *= x; b--; } x *= x; b /= 2; } return result; }} 时间复杂度:由于指数n在循环过程中不断被二分,直到变为0,时间复杂度为O(log2(n))。
空间复杂度:该方法仅使用了常数空间,无额外的空间开销,空间复杂度为O(1)。
递归方法通过将指数n不断除以2,并将结果分解为平方和余数部分来实现:
public class Solution { public double myPow(double x, int n) { if (n == 0) { return 1; } if (n == 1) { return x; } if (n == -1) { return 1.0 / x; } double half = myPow(x, n / 2); double remainder = myPow(x, n % 2); return half * half * remainder; }} 时间复杂度:递归过程中指数n被不断二分,时间复杂度为O(log2(n))。
空间复杂度:递归调用栈的深度为log2(n),空间复杂度为O(log2(n))。
以上两种方法均通过快速幂算法实现了高效的指数计算,适用于大范围的指数和底数。选择哪种方法取决于具体需求。
转载地址:http://ptca.baihongyu.com/