pow函数的源码
template<class _Ty> inline
_Ty _Pow_int(_Ty _X, int _Y)
{unsigned int _N;
if (_Y >= 0)
_N = (unsigned int)_Y;
else
_N = (unsigned int)(-_Y);
for (_Ty _Z = _Ty(1); ; _X *= _X)//主要的算法部分
{if ((_N & 1) != 0)
_Z *= _X;
if ((_N >>= 1) == 0)
return (_Y < 0 ? _Ty(1) / _Z : _Z);
}
}
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
方法1(递归方法)
#include<stdio.h>
double func(double x, int n)
{
if (n == 0)
return 1;
if (n == 1)
return x;
double y = func(x, n / 2);//递归方法
return n % 2 == 0 ? y * y : y * y * x;
}
double myPow(double x, int n)
{
if (n == 0)
{
return 1;
}
return n > 0 ? func(x, n) : 1.0 / func(x, n);//考虑到n的正负值
}
int main()
{
printf("%f\n",myPow(2.00000,10));
printf("%f\n",myPow(2.10000,3));
printf("%f\n",myPow(0.50000,-3));
return 0;
}
运行截图如下:
对于此程序用到的递归方法图解如下:
假设x=2.00000,n=5
方法2(常规方法)
#include<stdio.h>
double myPow(double x, int n)
{
if (n == 0)
return 1;
double res = 1;
if(n < 0)
{
x = 1 / x;
n=-n;
}
while(n!=0)
{
res *= x;
n--;
}
return res;
}
int main()
{
printf("%f\n",myPow(2.00000,10));
printf("%f\n",myPow(-2.10000,3));
printf("%f\n",myPow(0.50000,-3));
return 0;
}
运行结果如下