数值的整数次方(剑指offer第十二题)

一、题目描述

 给定一个double类型的浮点数base和int类型的整数exponent。 求base的exponent次方。

二、思路解析

 (1)常规思路:求次方的常规思路就是累积乘起来,所以可以用循环进行,但一定要注意特殊情况,保证程序的健壮性。

 (2)用快速幂思想:a的n次幂可以 分开讨论,如果n为偶数时,a的n次方可以写成 a的n/2次方乘以a的n/2次方

                                                                        如果n为奇数时,a的n次方可以写成 a的n/2次方乘以a的n/2次方再乘以a

          所以可以考虑用递归求解。(推荐使用该方法,看最后的最新代码)

三、可运行java代码

/*
 * 给定一个double类型的浮点数base和int类型的整数exponent。
 * 求base的exponent次方。
 */
public class Solution_12 {
	  public static void main(String[] args) {
		System.out.println(Power(2.5,-2));
		System.out.println(power1(2.5, -2));
	}
	  
	  //方法一、常规方法
	   public static double Power(double base, int exponent) {
		   double res = 1;
		   if(exponent == 0) return 1;
		   if(exponent>0){
	          for(int i=0;i<exponent;i++){
	         	res = res * base;
	         }
	          return res;
		   }else {
			   for(int i=0;i<Math.abs(exponent);i++){
		         	res = res * base;
		         }
			   return 1.0/res;
		}
	}
	   
	      //方法二、递归
		  public static double power1(double base,int exponent){
			   if(exponent==0) return 1;
			   if(exponent==1) return base;
			   int n = exponent>0?exponent:-exponent;
			   double result  = power1(base, n>>1);
			   result *= result;
			   if((n&0x1)==1){
				   result *= base;
			   }
			  return exponent>0?result:1/result;
		  }
	   
}

2020-9-29二刷最新代码:

class Solution {
    public double myPow(double x, int n) {
        if(x == 0) return 0;
        if(n == 0) return 1;
        boolean xf = false, nf = false;  //这两个flag是判断x和n的正负号,先剥离开计算pow后,再做符号处理
        double  temp = x;
        long nn = n; //为了防止2的-31次方是-2147483648,如果加符号的话就溢出了,所以用long类型
        if(x < 0) {
            xf = true;
            x = -x;
        }
        if(n < 0){
            nf = true;
            nn = -nn;
        }
     
        x = pow(x,nn);
   
        if(nf) x = 1/x;
        if(xf==true && n % 2 == 1) x = -x;
        return x;
    }
    public double pow(double x, long n) {
        if(x == 1 || n == 0) return 1;
        if(n == 1) return x;
        double temp = pow(x, n/2);
        if(n % 2 == 1) return temp*temp*x;
        return temp*temp;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值