【LeetCode-Java实现】50. Pow(x, n)求x的n次幂

50. Pow(x, n)求x的n次幂

  • 题目描述
  • 思路
  • 实现

题目描述

Implement pow(x, n), which calculates x raised to the power n (xn).
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
Example 3:
Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25
Note:
-100.0 < x < 100.0
n is a 32-bit signed integer, within the range [−231, 231 − 1]

实现求x的n次幂的函数

思路

  1. 暴力循环法,但是超时
    x的n次幂即n个x相乘
    (前提是n为正数,所以对于负数n,需要稍加改造,将n的负号放到x上)
  2. 分治法
    把n次幂分成两份:即xn=xn/2 *xn/2
    比如:28.=24. 24
    需要注意的是解决n的奇偶问题和正负问题
    定义个临时变量temp用来存储n次幂的一半:temp=myPow(x,n/2)
    如果n为偶数:直接返回 temp * temp
    如果n为奇数:需要在temp
    temp基础上再来一个x,此时多出来的这个次方的正负需要单独讨论:
    (1)若n是正数,直接乘上一个x即可
    (2)若n是负数,把负号移到x上,即除以一个x

实现

  1. 暴力循环(超时,没通过)
public double myPow(double x, int n) {
        //直接暴力求解,x的n次幂即n个x相乘(前提是n为正数,所以对于负数n,需要稍加改造)
        if(n<0){ //若n未负数,把负号放到x里,即x变成1/x
            x=1/x;
            n=-n;
        }
        
        double res=1;   //x的n次幂的结果
        for(int i=0;i<n;i++){  //n个x相乘
            res=res*x;
        }
        return res;
    }

  1. 分治法
 public double myPow(double x, int n) {
        //分治法,把次幂分为两半
        
        //边界情况
        if(n==0) return 1;
        
        double temp=x;
        temp=myPow(x,n/2);  //temp为次幂的一半
        //解决n的奇偶问题
        //n若是偶数,直接两份temp相乘即可
        if(n%2==0){
            return temp*temp;
        }
        //n若是奇数,两份temp相乘之后,还差一个x
        else{
            //解决n正负问题
            if(n>0){
                return temp*temp*x;
            }
            else{
                return temp*temp/x;
            }       
        }
    }

你可能感兴趣的:(LeetCode)