求 a 与 b 的最大公约数:gcd(a, b) = gcd(b, a mod b),辗转相除直到余数为 0,除数即答案——每次迭代规模至少砍半,复杂度 O(log min(a, b))。最小公倍数则由 gcd 推出:lcm = a 乘 b 除以 gcd。游戏里的落点:人数不等的队伍合并成整齐分组(求 gcd)、两个不同周期的刷新对齐(求 lcm)——商与余的数学是分组与调度的底层工具。
辗转相除与公倍数。示例代码如下:
local function gcd(a, b)
while b ~= 0 do
a, b = b, a % b
end
return a
end
local function lcm(a, b)
return a * b / gcd(a, b)
end
print(gcd(48, 36), lcm(48, 36))
输出 12 与 144——48 与 36 的最大公约 12,最小公倍 144。
联合阵型接线。示例代码如下:
local a, b = 48, 36
local g = gcd(a, b)
print("每组 " .. g .. " 人,甲队 " .. a / g .. " 组,乙队 " .. b / g .. " 组")
48 人与 36 人两队合并:每组 12 人、甲队 4 组乙队 3 组——参差的两队排出整齐阵型。掉落每 48 分钟刷新、资源每 36 分钟刷新,lcm 得 144:每 144 分钟两者重合,沙巴克资源点的世界事件就设在重合时刻。
从 min(a,b) 向下枚举公约数最坏 O(min(a,b)):48 与 36 要试 12 次;欧几里得只辗转 2 次(48,36 到 36,12 到 12,0)。数字放大到百万级,枚举不可行而欧几里得仍是几十次迭代——数值越大,对数复杂度的优势越大。
三个不适用场景:一是只需要判断两数是否互质(gcd 为 1),常规 gcd 已足够快,更快的随机化测试是多余;二是浮点输入——取余在浮点上有精度坑,先按倍率放大成整数再算;三是需要全部公约数列表的场景,gcd 只给最大值,枚举另走一遍。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:hp = 10000 + teamN 5000 —— 运镖劫镖的全部骨架:镖车按护送人数增强血量…
【语法】 一、隐蔽陷阱:逐个插入建堆要 n 次上浮;自底向上从末个非叶子节点倒序下沉,一遍线性把乱序表调成合法堆。 二、底层…
【语法】 一、抛坑提问:一个数等于它全部真因子之和就叫真因子和数,6 等于 1 加 2 加 3——判定只需枚举到平方根配对求…
【游戏】 一、一行代码拆解:n = math.floor(have / 5) —— 批量合成的全部骨架:5 个碎片合成 1 …
【游戏】 一、一行代码拆解:if INSURED[actor] then 赔付 end —— 装备保险的全部骨架:死亡掉落判…
【语法】 一、隐蔽陷阱:找第 K 小元素先全量排序再取下标,n log n 浪费在无关排序上;快速选择借用快排分区——每轮只…