如何在Brainfuck中将3位数字(用户输入)增加1?

时间:2018-01-21 19:46:14

标签: brainfuck

如何在Brainfuck中将3位数增加1? 例如。获得699这个代码的用户输入应该输出700。

这是我尝试过但不起作用的东西。

,>,>,+
<<.>.>.

1 个答案:

答案 0 :(得分:1)

它不起作用的原因是因为内存中没有3位数字。您有48-57的三个ASCII值(字符0 - 9)。我将解释如何做你需要的,但不会提供实际的BF代码进行乘法等,你可以在其他地方找到。

让我们调用字符XYZ

首先,我们需要将它们转换为0到9之间的数字。假设用户只输入数字,我们可以通过从ASCII值中减去48(ASCII字符0)来实现。

好的,现在我们有0-9的三个数字如下:

A = X - 48
B = Y - 48
C = Z - 48

问题是它们仍然是三个独立的数字而不是一个数字。实际数字是多少?在这种情况下,可以通过以下方式构建数字:

N = 100A + 10B + C

因此,您需要将A乘以100,将B乘以10,将C乘以1,然后将它们全部加在一起。可以按如下方式完成:

N = A
N = (N * 10) + B
N = (N * 10) + C

完成后,您在一个单元格中有一个实际数字,并且您可以通过执行N = N + 1来增加它,其中BF是单个+

现在这适用于最大255的数字,这是BF单元可以容纳的最大数字。你想使用更大的数字吗?它变得更加复杂,因为现在你必须将这个数字分成两个或更多的单元格,自己传播进位等等。我不会在这里进行,因为它变得更加复杂(尽管你可以在线找到算法)也有帮助)我认为这足以让你开始。

编辑:我意识到你的代码也试图打印递增的值。这需要更多工作,因为.命令将该单元格的值输出为ASCII字符。但是你需要输出三位数。要做到这一点,你需要颠倒上面的过程,将数字分成三个数字,如下所示:

C = N % 10
N = N / 10
B = N % 10
N = N / 10
A = N

然后您需要再次将它们从0-9转换为ASCII字符,如下所示:

X = A + 48
Y = B + 48
Z = C + 48

然后最后你可以按顺序输出字符X,Y和Z,这将是人类可读的递增数字。