1.当我们解一个数的n的k次方时首先就会想到最简单的方法
int my_print(int n,int k)//非递归求阶乘
{
int sum=1;
int p=n;
int q=k-1;
int i=0;
if(k<1)
{
return 1;
}
if(k>=1)
{
for(i=0; i<=q; i++)
sum=sum*p;
}
return sum;
}
还有递归写法
int my_print(int n,int k)//递归求阶乘
{
if(k<1)
{
return 1;
}
if(k>=1)
return n*my_print(n,k-1);
}
但是我们知道以上俩种解法的效率都不是特别高
所以我们想到其实假设一个数的n的k次方可以写成 n^k/2 * n^k/2; 假设k为奇数 n^k/2 * n^k/2*n既可以得出最后的答案,假设k为负数那么给得到的结果除以1便可2,所以我们得到了以下的代码
#include<stdio.h>
#include<windows.h>
double my_pow_2(double n, unsigned int k)
{
double ret;
if (k == 0)//如果n为1,多少个1相乘都是1
return 1;
if (k ==1)
return n;
ret = my_pow_2(n, k >> 1);// k >> 1将除以2后指数给下一次
ret *=ret;// 表示ret的平方
if ((k & 0x01) == 1)//如果k是个奇数,则结果还要乘上一个n
ret *= n;
return ret;
}
double my_pow1(double n,int k)
{
if (n == 0 && k != 0)
return 0;
if (k >= 0)
{
return my_pow_2(n, k);
}
else if(k<0)
{
return 1.0/my_pow_2(n, -k);
}
}
int main()
{
double buf;
buf = my_pow1(2,-1);
printf("%lf\n", buf);
system("pause");
return 0;
}