Closed. This question is off-topic。它当前不接受答案。












想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。

已关闭8年。



Improve this question





编写代码以确定一个数字是否可以被3整除。如果到目前为止接收到的数字是一个可以被3整除的二进制表示形式,则该函数的输入为单个位0或1,并且输出应该为1。零。

例子:

input  "0":       (0)  output 1
inputs "1,0,0":   (4)  output 0
inputs "1,1,0,0": (6)  output 1


这是基于面试问题。我要求绘制逻辑门,但是由于这是stackoverflow,因此我将接受任何编码语言。硬件实现的奖励点(verilog等)。

A部分(简单):第一个输入是MSB。

b部分(稍微难一点):第一个输入是LSB。

c部分(困难):(a)或(b)哪个更快,更小? (从理论上讲不是Big-O,而是实际上更快/更小。)现在,选择较慢/更大的一个,使其与更快/更小一样快/更小。

最佳答案

h

LSB的状态表:

S I S' O
0 0 0  1
0 1 1  0
1 0 2  0
1 1 0  1
2 0 1  0
2 1 2  0


说明:0被三整除。 0 << 1 + 0 = 0。重复使用S = (S << 1 + I) % 3O = 1(如果S == 0)。

MSB的状态表:

S I S' O
0 0 0  1
0 1 2  0
1 0 1  0
1 1 0  1
2 0 2  0
2 1 1  0


说明:0被三整除。 0 >> 1 + 0 = 0。重复使用S = (S >> 1 + I) % 3O = 1(如果S == 0)。

S'与上面不同,但是O的工作原理相同,因为对于相同的情况(00和11),S'为0。由于在两种情况下O相同,所以O_LSB = O_MSB,因此要使MSB与LSB一样短,反之亦然,请使用两者中最短的一个。

关于puzzle - 检查数字是否可被3整除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/844867/

10-12 16:13