正在确认登录状态…

前往登录
拓展实验 · 不占用原有 145 课编号

数字再大,
也能一位一位算。

把超长整数当作字符串保存。加减、比较、完整乘法和长除法,都只让 0–9 的小数字进入数值运算。先看网页轨迹,再照着搭蛋码。

验证范围:本页是可运行的网页算法演示,彩色图为教学连接示意。原生蛋码编辑器内的搭建、性能、联机同步与存档尚未实机验证;本页不是可导入的蛋码工程。

PLAY WITH EXACT DIGITS

字符串计算台

A、B 各 1–60 位,只接受 0–9。前导零可输入;不接受空格、负数、小数、科学计数法。减法要求 A ≥ B;除法输出整数商和余数。

01 · 先搭一个不会互相踩数据的测试台

先读 第 37 课:字符串比较 / 加减基础 和 第 38 课:小整数倍率。本页补上“两个完整字符串相乘”和“两个完整字符串相除”,不把第 38 课的小倍率直接扩大成超大整数。

在哪个画布搭?

  1. 按 编辑器入口指南进入当前地图的关卡蛋码,建一个专用触发器组“大数测试”。先用单人测试图,不接战斗、不接联机。
  2. 右侧“自定义 → 动作”新建下表动作。用“+”添加参数及类型,再点“定义”进入内部。官方基础说明支持这一创建流程。
  3. 主触发器使用“游戏初始化”。设置测试字符串,然后串行调用一个动作,最后用 发送信息输出结果。不要在定义内部再放一个游戏初始化事件。
  4. 下文所有 BN 前缀名称都是你新建的动作。它们不是在手册里能直接搜索到的官方积木;先把助手定义搭完,再接核心动作。

变量类型与作用域

  • 永久数值:字符串,例如生命文本、金币文本。中间大数也保持字符串。
  • 参数 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",乘格为空列表,布尔值默认为假。每个动作入口都重置自己的工作变量。辅助动作不能清空调用者的工作区。

原生积木在哪里找、槽里放什么?

以上链接指向本站 2026.09.03 手册快照的电脑端条目;移动端可在手册切换平台查同名积木。颜色图使用同名原生积木作教学表示,不承诺你的编辑器版本入口完全相同。

02 · 把基础助手真正搭完

先完成这些可复用定义。比较、加、减、乘、除的核心参数都要求已经校验并规范化;内部产生的 61–120 位结果不应再次受到“外部输入最多 60 位”的限制。

A. BN校验 + BN规范化

  1. 校验:每次入口先设“校验通过”为假,再取长度;仅 1 ≤ 长度 ≤ 60 才继续。此分支内再设“校验通过”为真,索引从 0 开始重复长度次。
  2. 每轮截取 [索引, 索引+1)。用 是否存在字符串判断 "0123456789" 中是否包含这个单字符;否则设校验通过为假。每一轮的最后都执行“校验索引 ← 校验索引 + 1”,放在字符判断分支外,合法与非法字符都向后移动。循环结束才决定是否进入计算。这样空格、e、负号都会被拒绝。
  3. 规范化:对已知非空数字串,设规范首=0、规范长=长度、规范扫描=真。重复“规范长−1”次;仅当规范扫描为真时检查 [规范首,规范首+1):为 "0" 则规范首+1,否则设规范扫描为假。
  4. 规范串 = 截取 [规范首,规范长)。全零串始终留下最后一个 "0"。不要把规范化写成直接删除所有 "0"。

B. BN取一位 + 数字转字符

  1. 先判断 0 ≤ p < 字符串长度,才截取 [p,p+1)。加减法的负索引补位直接给 0,不读取字符。
  2. 位值先设 0;位扫描=0;重复 10 次。每轮比较位字符与 "0123456789" 的 [位扫描,位扫描+1),相等就把位值设为位扫描。然后位扫描+1。
  3. 输出位值只有 0–9。它是整数;把它立即复制到调用者自己的“比位A”“乘x”等变量,避免下一次调用覆盖。
  4. 反向编码不需要转换大数:给定整数 d∈[0,9],取 "0123456789" 的 [d,d+1) 就得到单个数字字符。

网页采用单字符码值减 48;原生教程采用 10 项查找,不依赖文本转数值积木处理非法字符的行为。

C. BN比较(a,b)

  1. 比较值=0,读 a、b 的长度。长度短则 −1,长度长则 1;仅等长时进入逐位循环。
  2. 比索引=0,重复长度次。每轮先检查“比较值=0”,只有还没分出大小才调用两次 BN取一位,并立即保存为比位A、比位B。
  3. 若比位A < 比位B 则比较值=−1;若大于则=1。比索引每轮+1,已有结果后不再读取位数。
  4. 全部相等保持 0。不直接对超长文本做字典序比较,也不转整数。例如 "9" < "10" 必须先看长度。

D. BN加法(a,b)

  1. 和串="",加进位=0;加索引A=长度(a)−1,B 同理;加次数取两个长度较大值。
  2. 每轮把加位A、加位B设 0;索引 ≥ 0 时才读一位。加临时=加位A+加位B+加进位,范围 0–19。
  3. 先把加进位设 0;若加临时≥10,临时−10、进位=1。用单字符编码把临时值放在和串左边。
  4. 两个索引都−1。重复结束后,若进位=1,左边补 "1"。规范化输出。60 位输入的和允许达到 61 位。

E. BN减法(a,b):借位不能丢

  1. 调用 BN比较,连接“如果/否则”。若比较值<0,减法有效=假并输出差串="0" 作为占位,调用者必须检查有效标记,不能把它当真实差;这个分支不连接逐位减法。把下列第 2–4 步全部放进“否则”(比较值≥0)的内部,先设减法有效=真,才允许借位运算。
  2. 差串="",减借位=0;两个索引分别从尾部开始,重复长度(a)次。每轮读 A 当前位,B 索引小于 0 时用 0。
  3. 减临时=减位A−减位B−减借位,范围 −10…9。先设减借位=0;若减临时<0,临时+10、借位=1。把临时编码为一个字符并前置到差串。
  4. 索引每轮−1。结束后规范化差串。A≥B 时最后借位应为 0;用 1000−1=999 验证跨多个零的连续借位。

输入框不接受负数,减法也不返回负字符串。虚拟扣血采用“伤害≥生命→0,否则减法”的单独分支。

03 · 完整字符串 × 字符串

采用小学竖式乘法。一个结果格只放一位数字,长度 m+n;60 位乘 60 位最多产生 120 位。不要把 B 转成倍率整数,也不要把“逐位乘以小整数”误当成完整乘法。

BN乘法的逐槽连接

  1. 输入 a、b 已规范化。任一个为 "0",积串直接设 "0"。否则记录乘长A=m、乘长B=n,清空乘格,再重复 m+n 次追加整数 0。
  2. 乘i=m−1,外层重复 m 次。每行先设乘进位=0、乘j=n−1,调用 BN取一位(a,乘i),立即把位值复制到乘x。
  3. 内层重复 n 次:读 B[乘j] 到乘y,乘k=乘i+乘j+1。整数运算槽嵌套为“(乘格[乘k] + 乘x×乘y) + 乘进位”。存入乘临时。
  4. 拆十进制:乘进位=0;重复 9 次,如果乘临时≥10,就临时−10、进位+1。这等价于小整数除以 10 取整,避免依赖整数除法的舍入细节。
  5. 用“设置列表的元素”把乘临时写回乘格[乘k],乘j−1。内层结束后写乘格[乘i]=乘进位,再乘i−1。该格在本行开始前尚未写入,可直接赋值。
  6. 双层循环结束:积串="",乘拼=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除法的逐槽连接

  1. 输入 a、b 已规范化;先将商串="0"、余串="0"、除法有效=假。若 b="0",保留无效状态并让主入口报错,不能继续进入任何循环。
  2. 否则设除法有效=真、商串=""、余串="0"、除索引=0。外层重复长度(a)次。
  3. 取 a 的 [除索引,除索引+1),用“字符串扩展”拼在余串右侧;BN规范化后写回余串。注意这是文本拼接,相当于旧余数×10+本位数字,却从不转换旧余数。
  4. 除本位商=0。内层固定重复 9 次:先调用 BN比较(余串,b);若比较值≥0,调用 BN减法(余串,b),确认减法有效后令余串=差串、除本位商+1。已经小于除数的后续检查不再减。
  5. 把除本位商编码成一个字符,追加在商串右侧。必须包含中间的 0,例如 1005÷5 的商是 201,不能跳过 0。除索引+1。
  6. 结束后规范化商串;余串已经规范化。主入口读取商串和余串,同时检查除法有效;用 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 · 单位只影响展示,不能改写原值

只用字符串切片做单位

  1. 长度≤4:直接显示原串。其余按每 4 位一组:万=10⁴、亿=10⁸、兆=10¹²、京=10¹⁶;本页明确采用这套规则。
  2. 设组号 g=⌊(长度−1)/4⌋,左侧整数位数 h=长度−4g。原生可从 g=0、h=长度 开始,最多重复 29 次;h>4 时 h−4、g+1。
  3. 截取前 h 位作为整数部分,再取接下来的 2 位作为小数部分。例如 "123456789" 显示约 1.23亿。
  4. 被省略部分有非零数字就加“约 / 截断显示”。这里不四舍五入;"99999999" 显示约 9999.99万,不自动进到亿。
  5. 高于已定义单位表时显示“×10^组指数”,不要凭空编造单位名。计算、比较、结算始终使用未缩写的完整串。

显示与存档分别验收

单位串适合界面文字;不能用“1.23亿”重新参与运算。建议保留“精确串”和“显示串”两个变量。

设置字符串类型游玩进度的快照说明:最长 64 位,且要求标准 ASCII。单个 60 位输入符合这项长度要求;120 位积不能放入同一条字符串进度,含中文单位的展示串也不符合该说明。

需要保存长结果时,另设计分段存储、版本标记、段序与读回校验,先在目标项目验证容量和原子性。本实验不实现存档协议,不把显示缩写当作无损压缩。

06 · 伤害整数越界,先找对边界

字符串大数不会自动扩大引擎伤害槽的范围。造成伤害(角色/生物)的数值参数在手册中是“定点数”,不是字符串;组件造成伤害也是定点数。本页不声称它们支持某个未经测量的最大伤害,也不假定原生整数是 32 位或 64 位。

  1. 定位第一次转换:检查伤害从哪里生成、存在哪类变量、是否经过“转整数 / 转实数”、是否进入原生伤害槽。显示完整不等于原生结算完整。
  2. 虚拟数值方案:将虚拟生命和虚拟伤害保存成数字字符串。先比较:伤害≥生命则生命="0";否则用字符串减法。网页的“模拟扣血”演示这个过程。
  3. 击败与表现:虚拟生命变为 0 后,需要项目自行定义击败、掉落、防重复结算、飘字以及权威端同步。不要既扣虚拟生命又无条件调用原生伤害,导致重复结算。
  4. 与原生生命联动:若必须使用原生伤害事件,需要另设计并验证缩放/映射策略,实测可表示范围、精度及事件顺序。只把已确认安全的小值转换后送入原生槽,不能直接塞 60 位字符串。

本实验的计数最大为 3,600、列表最长为 120、乘法临时数最大为 99;这些是算法设计出的小整数范围,不是引擎上限声明。原生平台的限制与执行性能必须另测。

07 · 在编辑器里按固定数据验收

每次只跑一个测试,再比较调试窗口的完整文本。先用 2–6 位数字在编辑器测试并测量执行成本,再逐步增加长度;60 位是网页演示的输入上限,不是原生单帧性能承诺;网页通过不代表原生版本已通过。

主触发器:先跑乘法,再跑除法

先按定义表创建输入A / 输入B / 测试A / 测试B(字符串)与运算中(布尔值)。校验成功后复制规范串到测试变量,再调用核心。校验、减法或除法任何失败路径都要先发送具体错误信息,再设“运算中=假”,然后不再进入后续计算分支;成功路径读走结果后也释放同一个锁,避免一次错误阻断之后的合法输入。下图固定测试都有效,省略校验过程仅为展示调用连接;正式入口仍须先接校验。

“发送信息”的槽需要放积串 / 商串 / 余串变量取值,不是输入同名字面文本。日志预期依次为 408、184、17。第二次调用前后的输出保持独立;主触发器最后把运算中恢复为假。

运算 / 输入 A输入 B精确预期覆盖问题
比较:000123123=前导零归一
比较:910<先长度后逐位
加法:999999999999999999991100000000000000000000跨所有位进位
减法:1000000000000000000019999999999999999999跨零借位
减法:1213拒绝;减法有效=假不偷偷输出负数
乘法:1234408列索引与进位
乘法:12345678901234567890987654321098765432101219326311370217952237463801111263526900两个 20 位完整因数
乘法:000999999999999999999990零与规范化
除法:1234567商184;余17多个减法步骤
除法:10055商201;余0保留商中间的0
除法:79商0;余7被除数较小
除法:05商0;余0零被除数
除法:888000拒绝;除法有效=假规范化后除零
扣血:10000000000000000000099999999999999999999剩余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 位边界、单位截断、非法输入和界面重复操作。彩色图可放大阅读。

仍未验证:蛋码编辑器内执行、对象生命联动、多触发器并发、网络权威性、保存/读回与目标设备性能。请完成这些项目测试后再用于正式地图。