二分法快速计算x的n次幂(递归和循环实现)

题目:http://learn.akae.cn/media/ch11s06.html

编写一个函数double mypow(double x, int n);xn次方,参数n是正整数。最简单的算法是:

double product = 1;
for (i = 0; i < n; i++)
	product *= x;

这个算法的时间复杂度是Θ(n)。其实有更好的办法,比如mypow(x, 8),第一次循环算出x·x=x2,第二次循环算出x2·x2=x4,第三次循环算出4·x4=x8。这样只需要三次循环,时间复杂度是Θ(lgn)。思考一下如果n不是2的整数次幂应该怎么处理。请分别用递归和循环实现这个算法。

整理解答如下:

另参考: http://blog.csdn.net/morewindows/article/details/7174143


#include <stdio.h>
//将n拆解为二进制n[i](0b),从低位往高位,则x^n[i]各位分别代表因子x^1,x^2,x^4,x^8,…用变量accum在循环中保存该累乘.
//而n拆解后对应的某位若为1则表示结果应该含这部分乘积因子
//如x^6=x^110b=(x^1)*0+(x^2)*1+(x^4)*1,而x^8=x^1000b=(x^1)*0+(x^2)*0+(x^4)*0+(x^8)*1。
double mypow2(double x, int n)
{
	int i;
	double accum=x,pw=1;
	for (i=0; 1<<i <= n; i++)    //循环条件,2^i<=n
	{
		if(n>>i & 1)    //取n的二进制表示的第i位
			pw*=accum;
		accum*=accum;
	}
	return pw;
}

double mypow(double x, int n)
{
	if(n==0)
		return 1.0;
	if(n==1)
		return x;

	int acc=mypow(x,n/2);
	acc*=acc;
	if(n&1)
		return x*acc;
	else 
		return acc;
}

void main()
{
	for (;;)
	{
		int n;
		scanf("%d",&n);
		double pw=mypow(2.5,n);
		printf("%lf\n",pw);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值