[c语言]——求一个数的n的k次方的高效解法

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;
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值