如何在Brainfuck中以数字形式打印指针指向的单元格值?
适配需求的实现代码
针对初始单元格布局 (0)(0)(125)(0)(0)(指针指向值为125的单元格),以下代码可直接输出数字125,且仅占用11个单元格:
>++++++++++<[->+>+<<]>>[-<<+>>]<<[->>+>+<<<]>>>[-<<<+>>>]<[->++++++++++<[->+>+<<]>>[-<<+>>]<<[.>+<<-]>]>++++++++++++++++++++++++++++++++.
逐行注释说明
初始状态:指针位于第3个单元格(值=125),单元格序列为 [0,0,125,0,0,0,0,0,0,0,0](后续操作仅扩展至11个单元格)
>++++++++++<
移动指针到右侧单元格(第4位),写入除数10(10个+),再移回原单元格(第3位),为十位/个位的除法运算做准备。[->+>+<<]
循环执行:原单元格值减1,同时给右侧第4、5位单元格各加1,直到原单元格值为0。
作用:将125拆分为12组10(第4位值=12)和余数5(第5位值=5)——这是125÷10的商和余数实现逻辑。>>[-<<+>>]
移到第5位(余数5),循环将第4位的12减1,同时给原单元格(第3位)加1,直到第4位值为0。
作用:把商12移回原单元格,此时单元格状态:[0,0,12,10,5,0,...]<<[->>+>+<<<]
移回原单元格(第3位,值=12),循环减1,给右侧第5、6位单元格各加1,直到原单元格值为0。
作用:将12拆分为1组10(第5位值=1)和余数2(第6位值=2)——实现12÷10,得到百位1、十位2。>>>[-<<<+>>>]
移到第6位(余数2),循环将第5位的1减1,给原单元格(第3位)加1,直到第5位值为0。
作用:把百位1移回原单元格,此时单元格状态:[0,0,1,10,5,2,...]<[->++++++++++<[->+>+<<]>>[-<<+>>]<<[.>+<<-]>]
移到第5位(值=2,十位),先将除数10写入第7位,通过除法循环得到商2,给商加48(转为ASCII字符'2')后打印,最后清理临时单元格。>++++++++++++++++++++++++++++++++.
移到第6位(值=5,个位),加48(转为ASCII字符'5')后打印,完成最终输出。
Brainfuck除法操作核心逻辑
Brainfuck没有原生除法指令,所有正整数除法都依赖减法循环实现,步骤如下:
- 准备三个单元格:被除数(存储要计算的数)、除数(固定值,如10、100)、商(初始为0)
- 循环执行:被除数减去除数,同时商加1,直到被除数的值小于除数
- 循环结束后,商单元格的值就是除法的商,被除数单元格剩余的值就是余数
以计算125 ÷ 10为例:
- 初始状态:被除数=125,除数=10,商=0
- 循环12次后:被除数=125 - 12×10 = 5,商=12
- 最终结果:商12,余数5
这种方式仅适用于非负整数,完全覆盖0-255的8位单元格值范围。
内容的提问来源于stack exchange,提问作者Pertz Hertz

