快速幂

快速幂

 一种快速求指数的方法

一般求a^b的做法,就是将a循环相乘b次时间复杂度为O(b),即O(n),快速幂可以将时间复杂度将为O(logn)

那它是如何做到的呢

以b = 11 为例

11 的 二进制 为 1011,即2^3*1+2^2*0+2^1*1+2^0*1,所以a^b = a^(2^3*1)*a^(2^2*0)*(2^1*1)*a*(2^0*1)①

这里引入两个位操作符

>> 移位操作 ,将运算数的二进制整体右移指定位数 例如 11 >> 1 ==> 1011 ==> 101 = 5

& 与操作符 b&1 取b二进制的最后一位 例如 11&1 ==> 1011 & 1 = 1

通过这两个操作符就可以获得b二进制上的数字

每有一个2进制数字就连乘a一次得到a^(2^n),若某一位二进制数字为1则将该项乘到结果上,最后就能得到①式

代码:

#include "stdafx.h"
#include <iostream>


typedef long long ret;

ret poww(int a, int b)
{
	ret ans = 1L; ret base = a;
	while (b!=0)
	{
		if (b & 1 != 0)
			ans *= base;
		base *= base;
		b >>= 1;
	}
	return ans;
}

-----------------------------更新线----------------------------------------------

遇到leetcode上第50题后就感觉自己还是太天真

要考虑到int的范围……

double myPow(double x, int n) {
	double ans = 1.00000, base = x;
	if (n == 0) return ans;
	unsigned int  m;
	if (n < 0)
		 m = -n;
	else
		 m = n;
	if (ans == x) return ans;
	while (m != 0){
		if (m & 1)
			ans *= base;
		base *= base;
		m >>= 1;
	}

	return n > 0 ? ans : 1.0/ans;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值