【语法】
一、隐蔽陷阱
1÷7 的循环节 142857 好找,1÷6 的循环节却从第二位才开始——直接截小数位比对,混循环与纯循环混在一起,位数全算错。
二、底层原理
竖式除法由余数决定一切:每步余数 = 上步余数×10 对分母取余;余数一旦重复,从首现位置到当前位置就是循环节。余数只有分母种可能,重复必然循环。1/7 余数走 6 步回到起点,循环节 6 位;1/6 第 2 步余数重复,循环节 1 位。
三、正确代码
基础写法(循环节长度):
local function cycleLen(a, b)
local seen, r, pos = {}, a % b, 0
while r ~= 0 and seen[r] == nil do
pos = pos + 1
seen[r] = pos
r = r * 10 % b
end
if r == 0 then return 0 end
return pos - seen[r] + 1
end
进阶写法(循环节本体输出):
local function cycleText(a, b)
local seen, out = {}, {}
local r = a % b
while r ~= 0 and seen[r] == nil do
seen[r] = #out + 1
r = r * 10
out[#out + 1] = math.floor(r / b)
r = r % b
end
if r == 0 then return "有限小数" end
return table.concat(out, "", seen[r])
end
local p = getplayerbyname("cyc01")
sendmsg(p, 1, "1/7 循环节 " .. cycleText(1, 7))
四、引擎验证
1/7 循环节 142857 共 6 位;1/6 循环节 1 位且从第二位开始;1/8 判为有限小数。
五、FAQ
问:余数重复为何即循环?
答:余数决定商,重复后序列必然重演。
问:混循环怎么定位?
答:余数首现位置就是循环节起点。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、机制原理 一行代码拆解:dist[cur] + 1。网格上求起点到终点的最少步数,广度优先一遍出答案:起点入队…
【游戏】 一、规则机制 线上事故:画质只有高低两档,高档低配机掉帧,低档高配机糊成马赛克,两头挨投诉。画质分三档:流畅、均衡…
【游戏】 一、规则机制 线上事故:转生功能上线,玩家等级刚够就点转生,提示材料不足;再一看说明,写的是转生后的等级要求——界…
【语法】 一、机制原理 抛坑提问:地图上一堆据点,用最短的围墙全圈住——围墙怎么走?凸包给答案:包住全部点的最小凸多边形。单…
【游戏】 一、规则机制 隐蔽的坑:背包满时地上物品拾不起,自动拾取又全数失败,玩家手动挑得手忙脚乱。拾取策略分层:满仓时按品…
【游戏】 一、规则机制 抛个坑:好友改了名字就认不出谁是谁——备注名怎么留住?好友备注存在自己本地:备注只改自己的显示,不动…