这个想法是数字可以任意增长,这意味着你不能mod 3
在这里使用,因为你的数字会增长到超出你的整数类的容量。
这个想法是注意数字发生了什么。如果你在右边添加位,你实际上在做的就是向左移动一位并添加新的位。
左移与乘以 2 相同,添加新位是添加 0 或 1。假设我们从 0 开始,我们可以根据最后一个数字的模 3 递归地执行此操作。
last | input || next | example
------------------------------------
0 | 0 || 0 | 0 * 2 + 0 = 0
0 | 1 || 1 | 0 * 2 + 1 = 1
1 | 0 || 2 | 1 * 2 + 0 = 2
1 | 1 || 0 | 1 * 2 + 1 = 0 (= 3 mod 3)
2 | 0 || 1 | 2 * 2 + 0 = 1 (= 4 mod 3)
2 | 1 || 2 | 2 * 2 + 1 = 2 (= 5 mod 3)
现在让我们看看当你向左边添加一点时会发生什么。首先,请注意:
2 2n模 3 = 1
和
2 2n+1模 3 = 2
所以现在我们必须根据当前迭代是奇数还是偶数向 mod 添加 1 或 2。
last | n is even? | input || next | example
-------------------------------------------
d/c | don't care | 0 || last | last + 0*2^n = last
0 | yes | 1 || 0 | 0 + 1*2^n = 1 (= 2^n mod 3)
0 | no | 1 || 0 | 0 + 1*2^n = 2 (= 2^n mod 3)
1 | yes | 1 || 0 | 1 + 1*2^n = 2
1 | no | 1 || 0 | 1 + 1*2^n = 0 (= 3 mod 3)
1 | yes | 1 || 0 | 2 + 1*2^n = 0
1 | no | 1 || 0 | 2 + 1*2^n = 1