题目:http://learn.akae.cn/media/ch11s06.html
编写一个函数double mypow(double x, int n);
求x
的n
次方,参数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);
}
}