计算n次幂的C算法

下面是使用C语言计算 an(a任意实数,n 是正整数)的最快算法。
它利用了测试一个数是奇数在计算机上是非常容易的,和通过简单的移所有位向右来除以 2 的事实。

  • 步骤 1,初始化某个变量
    y := 1, k := n, f := a
  • 步骤 2,测试 k
    如果 k 为 0,跳转步骤 7
  • 步骤 3,(k 不是 0,测试 k 是否为偶数)
    如果 k 是偶数,跳转步骤 5
  • 步骤 4,(k 是奇数,乘入它)
    y: = y * f
  • 步骤 5,(k 除以 2 / 忽略余数,通过移位做除法,平方 f)
    k := k 右移 1 位 f := f * f
  • 步骤 6,(循环)
    回到步骤 2
  • 步骤 7,(完成,y 是结果 = an)
    返回 y

C语言中,你可以写如下算法:

   double power(double a, unsigned int n)
{
double y = 1;
double f = a;
unsigned int k = n;
while (k != 0) {
if ((k & 1) != 0) y *= f;
k >>= 1;
f *= f;
}
return y;
}

在一个天真的 a^100 的乘法中,我们可能需要乘 a 的循环的 100 次迭代,而这个循环迭代只用 7 次(数 100 写为 7 位)。

这个算法可以通过套上下列步骤轻易的扩展到有符号整数:

  • 步骤 1. 如果 k 是负数,取负这个值得到整数 k。n 仍记住最初的值。
  • 步骤 2. 进行对 y = a k | 的上述计算
  • 步骤 3. 如果 n 是负数,倒转结果 y := 1/y。y 现在是 an 对整数 n 的结果。

转载于:https://www.cnblogs.com/emituofo/archive/2011/11/24/2261636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值