数值的整数次方

it2023-02-13  85

数值的整数次方

题目描述:

在C语言的函数库里面其实有一个pow函数可以用来求一个数值的整数次方,本题的要求其实就是类似的去实现函数pow的功能,要求实现特定的库函数

题目解析:

由于不需要考虑很大的数字的问题,所以这道题看起来就非常的简单了,但是写出如下的代码就是会出错的代码 double Power(double base,int exponent) { int result=1.0; for(int i=1;i<=exponent;i++) { result*=base; } return result; 因为,如果代码是这样写的话,其实是没有考虑到指数的问题,因为指数其实可以是整数,0,负数的,所以,其实是需要根据指数的值来分情况进行讨论的。

思路一:

代码一:
我们可以在函数体里面,直接调用pow函数(前提是可以调用pow函数才可以使用这种方法) class Solution { public: double Power(double base, int exponent) { if (base==0.0) return 0; if (exponent==0) return 1; return pow(base,exponent); } };

思路二:

代码二:
class Solution { public: double Power(double base, int exponent) { if(exponent == 0) return 1; double res= 1; if(exponent>=0) { while(exponent--) { res*=base; } } else { exponent = abs(exponent); while(exponent--) res/=base; } return res; } };
代码2.1
class Solution { public: double Power(double base, int exponent) { int a = (exponent > 0) ? exponent : -exponent; double result = 1; for (int i = 0; i < a; i++) { result *= base; } return (exponent > 0) ? result : 1 / result; } };

思路三—既全面又高效的解法

如果我们输入的指数为32,那么就一共需要进行31次的循环,那么我们就可以换一种思路了,我们的目标是求出一个数字的32次方,如果我们已经知道了他的16次方,那么我们在现有的基础上再平方一次就可以了,而16次方是8次方的平方,这样一直类推下去,32次方的话,我们只需要进行5次乘法的操作,就可以达到我们的目的了代码如下所示: class Solution { public: double Power(double base, int exponent) { if(exponent < 0) { base = 1.0/base; exponent = -exponent; } double res = 1.0; double x = base; while(exponent) { if(exponent & 1) { res = res * x; } x = x*x; exponent >>= 1; } return res; } }; 可以提醒一下细节,我们用移位运算符代替了除以2的操作,因为移位运算符的效率会比除法的效率更高一些

测试用例

把底数和指数分别设置成为正数,负数和0
最新回复(0)