我想知道是否可以仅用代码开头的数字 k 来计算 Brainfuck 中 1+2+3+...+k 的总和?
例如,是否可以像这样执行 1+2+3:
+++>
(这里的代码创建一个两个加上三个,创建一个并添加它)
因为我可以这样做:+++>++>+[<<+>>-]<[<+>-]<
但是如果 k=10000 我该怎么做呢?
我想知道是否可以仅用代码开头的数字 k 来计算 Brainfuck 中 1+2+3+...+k 的总和?
例如,是否可以像这样执行 1+2+3:
+++>
(这里的代码创建一个两个加上三个,创建一个并添加它)
因为我可以这样做:+++>++>+[<<+>>-]<[<+>-]<
但是如果 k=10000 我该怎么做呢?
这是一个简单的版本。假设我们将前三个单元格命名y
为temp0
和x
。然后我们可以简单地在递减循环中使用这个算法:
+++ # Input number (in fisrt cell)
[ # loop while first cell is not 0
>[-] # if second cell is null
<[>>+<+<-] # copy first cell in second and third and decrease it to 0
>[<+>-] # move second cell in first cell
<- # decrement input
] # go to begin of while loop
>> # the current cell now has the result
请注意,这仅适用k = 22
于 8 位限制。要输出数字或处理更大的数字,您必须付出额外的努力。
,[[>+>+<<-]>-[<+>-]<]>>.
比 Ingo 更简洁有效的算法。使用三个“插槽”
|total|: 每次循环累加值
+++ input |num|
[ while |num| is non-zero
[>+>+<<-] copy |num| to |temp| and |results|
>-[<+>-] copy |temp-1| back to |num|
< reset pointer
]
>>. output |total|
相同的解释,但更详细
+++ input |num|
[ while |num| is non-zero
[ until |num| is zero
>+>+ increment |temp| and |total|
<< return to |num|
- decrement |num|
]
>- goto |temp|, decrement
[<+>-] until |temp| is zero; decrement |temp|; increment |num|
< goto |num|
]
>>. goto |total|, output it