面试题16:数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0
在这里插入图片描述
在这里插入图片描述

剑指offer

class Solution {
public:
double Power(double base, int exponent) {
    double result = 1.0; 
    int absexponent = exponent;
        
    if (absexponent < 0){
         if(equal(base, 0.0))  cerr << "输入无效的数据\n";   //对于精度要求高的,不能用==判断是否等于
        absexponent = -exponent;
    }
    if (absexponent == 0)
        return 1;    //n==0时0的0次方没有意义,此处将0的0次方结果定义为1
    
    while (absexponent){
        if (absexponent & 0x1 == 1)    //当absexponent为奇数时
            result *= base;                      
        base *= base;
        absexponent >>= 1;    //absexponent = absexponent >> 1; absexponent 除以2
    }
    return exponent >= 0 ? result : 1.0 / result;
}
    
bool equal(double num1, double num2){
    if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
        return true;
    else
        return false;
}
};

leetcode

超时(20200528)

/*
分析n>0,n=0,n<0的情况
*/
class Solution {
public:
	double powUnsignedExponent(double x, int n) {
		double a = x;
		double result = 1.0;
		if (n == 1)
			result = a;

		if ((n & 1) == 0) {//为偶数时
			while (n >> 1)
				x *= x;
			result = x;
		}

		else {//为奇数时
			n = n - 1;
			while (n >> 1)
				x *= x;
			result = a * x;
		}
		return result;
	}


	double myPow(double x, int n) {
		double res = 1.0;
		if (n < 0) {//第一种情况
			if (x == 0)
				cerr << "Invalid Input" << endl;
			else
				n = -n;
		}

		if (n == 0) { //第二种情况
			if (x == 0)
				cerr << "Meaningless Input" << endl;
			else
				return res;
		}

		else 
			res = powUnsignedExponent(x, n);
			
		return n >= 0 ? res : 1.0 / res;
	}
};

快速幂

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
	double myPow(double x, int n) {
		if (x == 0)//避免后续 x = 1/x 操作报错
			return 0;
		double res = 1;
		if (n < 0) {
			n = -n;
			x = 1 / x;
		}
		while (n) {
			if (n & 1) //n % 2 == 1
				res *= x; 
			x *= x;	//x = x^2
			n >>= 1; //n = n / 2
		}
		return res;
	}
};

此时会报错:

在这里插入图片描述

是因为当n=-2147483648,-n已经超出了int范围,故此处应注意:

class Solution {
public:
	double myPow(double x, int n) {
		if (x == 0)//避免后续 x = 1/x 操作报错
			return 0;
		double res = 1;
        long b = n;
		if (b < 0) {
			b = -b;
			x = 1 / x;
		}
		while (b) {
			if (b & 1) //n % 2 == 1
				res *= x; 
			x *= x;	//x = x^2
			b >>= 1; //n = n / 2
		}
		return res;
	}
};

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值