数值的整数次方

面试题11:数字的整数次方

题目:实现函数dboule Power(double base,int exponent)。求base的exponent的次方


看到题目之后第一反应有一道考查细节的题目,因为题目本身似乎太简单了,所以想到了关于次方的几种情况:base为0是无意义,exponent为0时都为0,为负数时相当于求base的-exponent次方的倒数。

double Power(double base,int exponent){
	int result = 1.0;
	if(base == 0|| exponent == 0){
		return 0.0;
	}else if(exponent<0){
		return 1.0/Power(base,-exponent);
	}else{
		for(int i=0;i<exponent;i++){
			result = result * base;
		}
		return result;
	}
}

但没想到还是错了,而且依旧是细节。首先关于double 0的比较,我们知道计算机采用的是离散的存储方式也就是说不是所有的值都是一一对应的,也就说0 == 0没问题,但是.0.0==0.0是不是就不一定了,因此判断double数是否相等时采用的方法是:相减然后结果在一个很小的区间内就认为是相等、还有就是效率方面,刚开始以为是细节题,所以就没再效率上下功夫,结果确实有好的方法。我采用的方法是最简单的方法,但是我们可以考虑下:若n为偶数,则a^n = (a^n/2)^2,这样计算量就可以减少了一般。为奇数时只要用n-1代替n最后再乘以a就可以了。

double Power(double base,int exponent){
	int result = 1.0;
	if(base == 0|| exponent == 0){
		return 0.0;
	}else if(exponent<0){
		return 1.0/Power(base,-exponent);
	}else{
		PowerWithExponent(base,exponent);
		return result;
	}
}

PowerWithExponent(double base,int exponent){
		if(exponent == 0){
			return 1;
		}
		if(exponent == 1){
			return base;
		}

		double res = PowerWithExponent(base,expoent>>1);
		
		res *= res;

		if(exponent &0x1 == 1){//指数为奇数
			return base * res;
		}else{
			return res;
		}

	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值