求 b 的 n 次方,逐个连乘是 O(n);快速幂把指数按二进制拆解——n 的每一个二进制位对应一次底数平方,位为 1 时才额外乘一次。复杂度从 O(n) 降到 O(log n):n 等于 100 万时连乘要 100 万次乘法,快速幂只要约 20 次。游戏里的落点:复利计算(日利率连乘 365 天)、经验衰减的幂函数曲线——一切"同一倍率连乘很多次"的场景。
二进制拆解的幂运算。示例代码如下:
local function fastPow(b, n)
local result = 1
while n > 0 do
if n % 2 == 1 then
result = result * b
end
b = b * b
n = math.floor(n / 2)
end
return result
end
print(fastPow(3, 13))
输出 1594323(3 的 13 次方)——13 的二进制是 1101,全程只做 4 次平方加 3 次乘法。
复利接线。示例代码如下:
local rate = 1.02
print(math.floor(1000 * fastPow(rate, 365)))
1000 金币日息 2% 存 365 天——365 次连乘压缩到约 10 次乘法,本息合计直接见数。
连乘求 2 的 30 次方要 30 次乘法,快速幂约 10 次,快 3 倍;指数放大到 100 万时连乘要 100 万次,快速幂约 40 次——快 2.5 万倍,指数越大差距越悬殊。浮点底数下两种方法的累计误差同级,选择依据是速度而不是精度。
三个不适用场景:一是指数为小数(开方类需求),快速幂只处理整数指数;二是指数个位数大小,直接连乘更直白,为省两三次乘法牺牲可读性不值;三是密码学式的模幂运算(边乘边对模数取余防溢出),纯浮点版会精度崩坏,不能照搬。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 任务链按 next 映射逐格跳转,怀疑某条链绕回了旧节点。用 visited 表记录走过的节点能判环…
【游戏】 一、业务场景 交易行里有人收了定金就消失,买家吃闷亏还没处查底细。信用分规则上线:每笔成交双方互评,好评加 2 分…
【语法】 一、隐蔽陷阱 运营报表里"截止第 3 关的最高分"显示 40,可那一批数据里确实出过 120。数据没丢,问题出在统…
【游戏】 一、业务场景 玩家反映:花 30 金锭重随一件武器,好不容易出了一条攻击加成,下一轮重随又把它洗没了,连洗 8 次…
【语法】 一、隐蔽陷阱 把 1000 个金币打包成不超过 25 个包裹,单包容量多大才够?从 1 开始逐个容量去试要跑上千次…
【游戏】 一、业务场景 帮会仓库积了 80 万资金,帮众修装备要借钱,之前的写法是谁申请谁直接扣款,一周被冒领 12 万。资…