如何使用BrainF**k实现可以取余数的除法?

上次实现了一个不带余数的整除运算(https://blog.mcplugin.cn/p/609),这次来个带余数的除法运算。

已知BUG:被除数不得与除数相等(如:1/1 ; 2/2 ; 3/3等);
整数除法最后的商会比正确的商小1,但余数会等于除数
(如:8/4 == 1······4);

思路

这次和上次一样,仍无具体的电子版草稿,只有纸质草稿。

大体思路为:使用乘法猜商,每猜一次,猜的商都与被除数做差,得到余数,再将余数与除数比较大小,若于数大于除数,则继续猜商;若余数小于除数,则输出。


用法

起始指针、参数、返回值、最终指针与运算损耗:

  • 起始指针:
    • i0
  • 参数:
    • i0:存放被除数
    • i1:存放除数
  • 返回值:
    • i2:存放i0与i1相除后的商
    • i3:存放i0与i1相除后的余数
  • 运算损耗位:
    • i0、i1、i2、i3、i4、i5、i6、i7、i8、i9、i10、i11、i12
  • 最终指针:
    • i1

代码

,>,[[->>>+>+<<<<]>>>>[-<<<<+>>>>]<<<+
[->+>>+<<<]>>>[-<<<+>>>]<<[->>>+<<<]>
[->>[->+<<+>]>[-<+>]<<<]>>[-]<<<<<<
[->>>>>>+>+<<<<<<<]>>>>>>>[-<<<<<<<+>>>>>>>]
<<[->-<]>[->+>+<<]>>[-<<+>>]<<<<<<<[->>>+>+<<<<]
>>>[-<<<+>>>]>

# ↓对i5 i6比较大小
[->-<[->>>+>>+<<<<<]>[->>>+>>+<<<<<]>>>>
[-<<<<<+>>>>>]>[-<<<<<+>>>>>]<<<>[->+<]<
[[-]>+<]>>[[-]>+<]><<[-<+>]>>[-<<+>>]<<<
[[->[->[-]+<]<]]>[-]>>+<[->-<]>[[-]<<<<<<
[-]>>>>>>]<<<<<<]
# ↑对i5 i6比较大小

>[[-]>>+<<]>>>+<[->-<]>[[-]<<<+>>>]
<<<[[-]>[-<<<<+>>>>]<<<<<<[-]>>>>>]>[-]<<<<<<]

截图

计算5÷2的结果——商2余1

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code