数字再大,
也能一位一位算。
把超长整数当作字符串保存。加减、比较、完整乘法和长除法,都只让 0–9 的小数字进入数值运算。先看网页轨迹,再照着搭蛋码。
验证范围:本页是可运行的网页算法演示,彩色图为教学连接示意。原生蛋码编辑器内的搭建、性能、联机同步与存档尚未实机验证;本页不是可导入的蛋码工程。
PLAY WITH EXACT DIGITS
字符串计算台
A、B 各 1–60 位,只接受 0–9。前导零可输入;不接受空格、负数、小数、科学计数法。减法要求 A ≥ B;除法输出整数商和余数。
整数商
余数:
看每一步,把算法拆开
01 · 先搭一个不会互相踩数据的测试台
先读 第 37 课:字符串比较 / 加减基础 和 第 38 课:小整数倍率。本页补上“两个完整字符串相乘”和“两个完整字符串相除”,不把第 38 课的小倍率直接扩大成超大整数。
变量类型与作用域
- 永久数值:字符串,例如生命文本、金币文本。中间大数也保持字符串。
- 参数 a / b / s:字符串;p:整数。定义里的参数是传入值,不要用同名共享变量替代。
- 索引、长度、单个数字、进位、借位:整数。乘格:整数列表,最多 120 项。
- 在专用测试地图里创建带统一项目名前缀的全局变量,供主触发器与各自定义定义明确共享;每个助手再用不同工作前缀。下面的“结果槽”是你建的变量,不是动作的原生返回端口。
- 一条调用链同步串行完成;调用后立即复制所需结果,再调下一个助手。这些全局变量会被所有触发器共享,不能当作每次调用独立的栈,也不要与正式地图的同名变量混用。
| 自建动作及输入参数 | 全局结果槽(专用测试地图) | 工作变量(各动作用自己的前缀) |
|---|---|---|
| BN校验(s: 字符串) | 校验通过:布尔值 | 校验长度 / 校验索引:整数;校验字符:字符串 |
| BN规范化(s: 字符串) | 规范串:字符串 | 规范首 / 规范长:整数;规范扫描:布尔值 |
| BN取一位(s: 字符串, p: 整数) | 位值:整数 | 位字符:字符串;位扫描:整数 |
| BN比较(a: 字符串, b: 字符串) | 比较值:整数(−1 / 0 / 1) | 比长A / 比长B / 比索引 / 比位A / 比位B:整数 |
| BN加法(a: 字符串, b: 字符串) | 和串:字符串 | 加索引A / 加索引B / 加次数 / 加位A / 加位B / 加临时 / 加进位:整数 |
| BN减法(a: 字符串, b: 字符串) | 差串:字符串;减法有效:布尔值 | 减索引A / 减索引B / 减位A / 减位B / 减临时 / 减借位:整数 |
| BN乘法(a: 字符串, b: 字符串) | 积串:字符串 | 乘格:整数列表;乘长A / 乘长B / 乘i / 乘j / 乘k / 乘x / 乘y / 乘临时 / 乘进位 / 乘拼:整数 |
| BN除法(a: 字符串, b: 字符串) | 商串 / 余串:字符串;除法有效:布尔值 | 除索引 / 除本位商:整数;除前缀:字符串 |
建变量时:所有整数默认为 0,字符串输出默认为 "0",乘格为空列表,布尔值默认为假。每个动作入口都重置自己的工作变量。辅助动作不能清空调用者的工作区。
原生积木在哪里找、槽里放什么?
- 取值 → 字符串 → 截取字符串:s、起点 p、终点 p+1。手册例子“abcde 的 1 到 3 得 bc”,即从 0 起、终点不含。
- 取值 → 字符串 → 获取字符串长度:输入 s,输出整数长度。
- 取值 → 字符串 → 字符串扩展:两个槽都是字符串,用于拼接。不能用整数“+”拼数字文本。
- 取值 → 数学 → 整数运算(+-×÷):仅用于小整数和索引;本页原生方案不用未核验的整数除法舍入规则。
- 条件 → 通用 → 比较:数字长度/单个位做整数比较;字符只做等号比较。
- 控制 → 重复执行、如果/否则:循环次数已知,减少无限循环风险。
- 控制 → 遍历整数:0 到 n、步长 1 实际遍历 0…n−1。核心图采用重复次数和显式索引,避免猜负步长行为。
- 动作 → 列表 → 移除列表所有元素后,用 列表添加(增加)追加 0;索引第一项为 0。
- 取值 → 整数 → 列表取值:整数:乘格、乘k。先创建足够元素,读不存在的位置会失败。
- 动作 → 列表 → 设置列表的元素:乘格、乘k、新整数值;不要用“插入”,插入会移动后续索引。
以上链接指向本站 2026.09.03 手册快照的电脑端条目;移动端可在手册切换平台查同名积木。颜色图使用同名原生积木作教学表示,不承诺你的编辑器版本入口完全相同。
02 · 把基础助手真正搭完
先完成这些可复用定义。比较、加、减、乘、除的核心参数都要求已经校验并规范化;内部产生的 61–120 位结果不应再次受到“外部输入最多 60 位”的限制。
A. BN校验 + BN规范化
- 校验:每次入口先设“校验通过”为假,再取长度;仅 1 ≤ 长度 ≤ 60 才继续。此分支内再设“校验通过”为真,索引从 0 开始重复长度次。
- 每轮截取 [索引, 索引+1)。用 是否存在字符串判断 "0123456789" 中是否包含这个单字符;否则设校验通过为假。每一轮的最后都执行“校验索引 ← 校验索引 + 1”,放在字符判断分支外,合法与非法字符都向后移动。循环结束才决定是否进入计算。这样空格、e、负号都会被拒绝。
- 规范化:对已知非空数字串,设规范首=0、规范长=长度、规范扫描=真。重复“规范长−1”次;仅当规范扫描为真时检查 [规范首,规范首+1):为 "0" 则规范首+1,否则设规范扫描为假。
- 规范串 = 截取 [规范首,规范长)。全零串始终留下最后一个 "0"。不要把规范化写成直接删除所有 "0"。
B. BN取一位 + 数字转字符
- 先判断 0 ≤ p < 字符串长度,才截取 [p,p+1)。加减法的负索引补位直接给 0,不读取字符。
- 位值先设 0;位扫描=0;重复 10 次。每轮比较位字符与 "0123456789" 的 [位扫描,位扫描+1),相等就把位值设为位扫描。然后位扫描+1。
- 输出位值只有 0–9。它是整数;把它立即复制到调用者自己的“比位A”“乘x”等变量,避免下一次调用覆盖。
- 反向编码不需要转换大数:给定整数 d∈[0,9],取 "0123456789" 的 [d,d+1) 就得到单个数字字符。
网页采用单字符码值减 48;原生教程采用 10 项查找,不依赖文本转数值积木处理非法字符的行为。
C. BN比较(a,b)
- 比较值=0,读 a、b 的长度。长度短则 −1,长度长则 1;仅等长时进入逐位循环。
- 比索引=0,重复长度次。每轮先检查“比较值=0”,只有还没分出大小才调用两次 BN取一位,并立即保存为比位A、比位B。
- 若比位A < 比位B 则比较值=−1;若大于则=1。比索引每轮+1,已有结果后不再读取位数。
- 全部相等保持 0。不直接对超长文本做字典序比较,也不转整数。例如 "9" < "10" 必须先看长度。
D. BN加法(a,b)
- 和串="",加进位=0;加索引A=长度(a)−1,B 同理;加次数取两个长度较大值。
- 每轮把加位A、加位B设 0;索引 ≥ 0 时才读一位。加临时=加位A+加位B+加进位,范围 0–19。
- 先把加进位设 0;若加临时≥10,临时−10、进位=1。用单字符编码把临时值放在和串左边。
- 两个索引都−1。重复结束后,若进位=1,左边补 "1"。规范化输出。60 位输入的和允许达到 61 位。
E. BN减法(a,b):借位不能丢
- 调用 BN比较,连接“如果/否则”。若比较值<0,减法有效=假并输出差串="0" 作为占位,调用者必须检查有效标记,不能把它当真实差;这个分支不连接逐位减法。把下列第 2–4 步全部放进“否则”(比较值≥0)的内部,先设减法有效=真,才允许借位运算。
- 差串="",减借位=0;两个索引分别从尾部开始,重复长度(a)次。每轮读 A 当前位,B 索引小于 0 时用 0。
- 减临时=减位A−减位B−减借位,范围 −10…9。先设减借位=0;若减临时<0,临时+10、借位=1。把临时编码为一个字符并前置到差串。
- 索引每轮−1。结束后规范化差串。A≥B 时最后借位应为 0;用 1000−1=999 验证跨多个零的连续借位。
输入框不接受负数,减法也不返回负字符串。虚拟扣血采用“伤害≥生命→0,否则减法”的单独分支。
03 · 完整字符串 × 字符串
采用小学竖式乘法。一个结果格只放一位数字,长度 m+n;60 位乘 60 位最多产生 120 位。不要把 B 转成倍率整数,也不要把“逐位乘以小整数”误当成完整乘法。
BN乘法的逐槽连接
- 输入 a、b 已规范化。任一个为 "0",积串直接设 "0"。否则记录乘长A=m、乘长B=n,清空乘格,再重复 m+n 次追加整数 0。
- 乘i=m−1,外层重复 m 次。每行先设乘进位=0、乘j=n−1,调用 BN取一位(a,乘i),立即把位值复制到乘x。
- 内层重复 n 次:读 B[乘j] 到乘y,乘k=乘i+乘j+1。整数运算槽嵌套为“(乘格[乘k] + 乘x×乘y) + 乘进位”。存入乘临时。
- 拆十进制:乘进位=0;重复 9 次,如果乘临时≥10,就临时−10、进位+1。这等价于小整数除以 10 取整,避免依赖整数除法的舍入细节。
- 用“设置列表的元素”把乘临时写回乘格[乘k],乘j−1。内层结束后写乘格[乘i]=乘进位,再乘i−1。该格在本行开始前尚未写入,可直接赋值。
- 双层循环结束:积串="",乘拼=0,重复 m+n 次。读取乘格[乘拼],用数字字符表编码后追加在积串右侧,乘拼+1。最后 BN规范化(积串),积串=规范串。
边界证明:乘k 最小为 1,最大 m+n−1;行首写乘i 的范围是 0…m−1,全部已初始化。每步旧格≤9、单个位积≤81、进位≤9,所以乘临时≤99。最大只有 3,600 次乘位计算;原生固定 9 次拆位还会增加控制执行成本,需实机测性能。
展开彩色图:定义内部、双重循环与参数嵌套
一眼验算:12 × 34
结果格初始:[0, 0, 0, 0] i=1,j=1:0+2×4+0=8 → 格[3]=8 i=1,j=0:0+2×3+0=6 → 格[2]=6;格[1]=0 i=0,j=1:6+1×4+0=10 → 格[2]=0,进位1 i=0,j=0:0+1×3+1=4 → 格[1]=4;格[0]=0 拼成 "0408" → 去前导零 → "408"
常见错接
- 循环中把“增加元素”当作“设置元素”:列表越算越长。增加只用于初始化,计算时只设置已有格。
- 每一行忘了清空进位:上一行会重复进入下一行。
- 乘k 写成 i+j:错位一格。个位积必须进入 i+j+1。
- 整个乘法过程中只创建 60 格:完整结果需要 m+n 格。
- 直接把完整积串转整数输出:字符串算法没溢出,最后转换却再次越界。
04 · 完整字符串 ÷ 字符串
从左向右逐位落下被除数。余数保存在字符串里,每位商只会是 0–9。此处的“除法”指非负整数除法,输出商和余数,不输出无限小数。
BN除法的逐槽连接
- 输入 a、b 已规范化;先将商串="0"、余串="0"、除法有效=假。若 b="0",保留无效状态并让主入口报错,不能继续进入任何循环。
- 否则设除法有效=真、商串=""、余串="0"、除索引=0。外层重复长度(a)次。
- 取 a 的 [除索引,除索引+1),用“字符串扩展”拼在余串右侧;BN规范化后写回余串。注意这是文本拼接,相当于旧余数×10+本位数字,却从不转换旧余数。
- 除本位商=0。内层固定重复 9 次:先调用 BN比较(余串,b);若比较值≥0,调用 BN减法(余串,b),确认减法有效后令余串=差串、除本位商+1。已经小于除数的后续检查不再减。
- 把除本位商编码成一个字符,追加在商串右侧。必须包含中间的 0,例如 1005÷5 的商是 201,不能跳过 0。除索引+1。
- 结束后规范化商串;余串已经规范化。主入口读取商串和余串,同时检查除法有效;用 A=B×商+余数核验,并确认余数<B。
为什么每位最多减 9 次?上一轮余数 r<B。落下一位 d 后,新前缀为 10r+d,且 d≤9,所以新前缀<10B。本位商最多 9。对整个被除数反复减 B 的朴素算法不具备这个界限,不能替代本方案。
展开彩色图:除零分支、逐位落下与 9 次有界减法
12345 ÷ 67 的完整轨迹
落下1:前缀1,小于67 → 本位商0,余1 落下2:前缀12,小于67 → 本位商0,余12 落下3:前缀123,减1次67 → 本位商1,余56 落下4:前缀564,减8次67 → 本位商8,余28 落下5:前缀285,减4次67 → 本位商4,余17 商 "00184" → "184";余数 "17" 核验:67 × 184 + 17 = 12345;17 < 67
循环与临时值的上限
- 外层≤60次,内层≤9次,共≤540次试减检查。每个比较/减法仍会扫描字符串,不能把它称为 540 个原生积木执行。
- 除索引是 0…长度(a)−1;截取终点是索引+1。循环完成后的长度值不再用于取字符。
- 除本位商≤9;减法的借位≤1。余数和前缀始终是字符串,不占用整数的数值范围。
- 算不尽时保留余数,如 7÷3=2 余 1。若游戏需要小数,应另定精度及舍入规则,本页不偷偷补浮点除法。
05 · 单位只影响展示,不能改写原值
只用字符串切片做单位
- 长度≤4:直接显示原串。其余按每 4 位一组:万=10⁴、亿=10⁸、兆=10¹²、京=10¹⁶;本页明确采用这套规则。
- 设组号 g=⌊(长度−1)/4⌋,左侧整数位数 h=长度−4g。原生可从 g=0、h=长度 开始,最多重复 29 次;h>4 时 h−4、g+1。
- 截取前 h 位作为整数部分,再取接下来的 2 位作为小数部分。例如 "123456789" 显示约 1.23亿。
- 被省略部分有非零数字就加“约 / 截断显示”。这里不四舍五入;"99999999" 显示约 9999.99万,不自动进到亿。
- 高于已定义单位表时显示“×10^组指数”,不要凭空编造单位名。计算、比较、结算始终使用未缩写的完整串。
显示与存档分别验收
单位串适合界面文字;不能用“1.23亿”重新参与运算。建议保留“精确串”和“显示串”两个变量。
设置字符串类型游玩进度的快照说明:最长 64 位,且要求标准 ASCII。单个 60 位输入符合这项长度要求;120 位积不能放入同一条字符串进度,含中文单位的展示串也不符合该说明。
需要保存长结果时,另设计分段存储、版本标记、段序与读回校验,先在目标项目验证容量和原子性。本实验不实现存档协议,不把显示缩写当作无损压缩。
06 · 伤害整数越界,先找对边界
字符串大数不会自动扩大引擎伤害槽的范围。造成伤害(角色/生物)的数值参数在手册中是“定点数”,不是字符串;组件造成伤害也是定点数。本页不声称它们支持某个未经测量的最大伤害,也不假定原生整数是 32 位或 64 位。
- 定位第一次转换:检查伤害从哪里生成、存在哪类变量、是否经过“转整数 / 转实数”、是否进入原生伤害槽。显示完整不等于原生结算完整。
- 虚拟数值方案:将虚拟生命和虚拟伤害保存成数字字符串。先比较:伤害≥生命则生命="0";否则用字符串减法。网页的“模拟扣血”演示这个过程。
- 击败与表现:虚拟生命变为 0 后,需要项目自行定义击败、掉落、防重复结算、飘字以及权威端同步。不要既扣虚拟生命又无条件调用原生伤害,导致重复结算。
- 与原生生命联动:若必须使用原生伤害事件,需要另设计并验证缩放/映射策略,实测可表示范围、精度及事件顺序。只把已确认安全的小值转换后送入原生槽,不能直接塞 60 位字符串。
本实验的计数最大为 3,600、列表最长为 120、乘法临时数最大为 99;这些是算法设计出的小整数范围,不是引擎上限声明。原生平台的限制与执行性能必须另测。
07 · 在编辑器里按固定数据验收
每次只跑一个测试,再比较调试窗口的完整文本。先用 2–6 位数字在编辑器测试并测量执行成本,再逐步增加长度;60 位是网页演示的输入上限,不是原生单帧性能承诺;网页通过不代表原生版本已通过。
主触发器:先跑乘法,再跑除法
先按定义表创建输入A / 输入B / 测试A / 测试B(字符串)与运算中(布尔值)。校验成功后复制规范串到测试变量,再调用核心。校验、减法或除法任何失败路径都要先发送具体错误信息,再设“运算中=假”,然后不再进入后续计算分支;成功路径读走结果后也释放同一个锁,避免一次错误阻断之后的合法输入。下图固定测试都有效,省略校验过程仅为展示调用连接;正式入口仍须先接校验。
“发送信息”的槽需要放积串 / 商串 / 余串变量取值,不是输入同名字面文本。日志预期依次为 408、184、17。第二次调用前后的输出保持独立;主触发器最后把运算中恢复为假。
| 运算 / 输入 A | 输入 B | 精确预期 | 覆盖问题 |
|---|---|---|---|
| 比较:000123 | 123 | = | 前导零归一 |
| 比较:9 | 10 | < | 先长度后逐位 |
| 加法:99999999999999999999 | 1 | 100000000000000000000 | 跨所有位进位 |
| 减法:10000000000000000000 | 1 | 9999999999999999999 | 跨零借位 |
| 减法:12 | 13 | 拒绝;减法有效=假 | 不偷偷输出负数 |
| 乘法:12 | 34 | 408 | 列索引与进位 |
| 乘法:12345678901234567890 | 98765432109876543210 | 1219326311370217952237463801111263526900 | 两个 20 位完整因数 |
| 乘法:000 | 99999999999999999999 | 0 | 零与规范化 |
| 除法:12345 | 67 | 商184;余17 | 多个减法步骤 |
| 除法:1005 | 5 | 商201;余0 | 保留商中间的0 |
| 除法:7 | 9 | 商0;余7 | 被除数较小 |
| 除法:0 | 5 | 商0;余0 | 零被除数 |
| 除法:888 | 000 | 拒绝;除法有效=假 | 规范化后除零 |
| 扣血:100000000000000000000 | 99999999999999999999 | 剩余1 | 不通过原生伤害数值槽 |
| 输入:空串 / 1e20 / −1 / 1.5 / 12 / 空格 | 任意合法数字 | 校验失败,不计算 | 非法格式 |
| 输入:61个数字(包括前导零) | 1 | 校验失败,不截断 | 外部输入边界 |
60 位边界验收
令 N 为 60 个 9。N×N 的结果应为“59 个 9 + 8 + 59 个 0 + 1”,共 120 位;N÷N 应商 1 余 0;N÷1 应商 N 余 0。可直接点计算台的“60 位 × 60 位”复现。
- 连续两次乘法结果一致,没有累加到旧列表
- 除零后再跑合法除法,错误标记已正确重置
- 等值相减输出单个 0
- 换输入后,没有沿用上一轮索引/进位/余数
- 每个自定义助手有自己的工作变量,嵌套调用不改外层索引
网页已测什么,仍需测什么
本页配套 自动测试脚本使用固定种子的随机数,借助 Node 的 BigInt 作为测试对照;浏览器算法本身不使用 BigInt,也不将完整输入转成 Number。
网页测试覆盖比较、加减、完整乘除、60 位边界、单位截断、非法输入和界面重复操作。彩色图可放大阅读。
仍未验证:蛋码编辑器内执行、对象生命联动、多触发器并发、网络权威性、保存/读回与目标设备性能。请完成这些项目测试后再用于正式地图。
999… × 999…