请向我解释下面问题的解决方案

时间:2011-04-10 05:42:48

标签: algorithm math discrete-mathematics

问题:

考虑添加两个n位二进制整数的问题,存储在两个n元素数组A和B中。两个整数之和应以二进制形式存储在(n + 1)元素数组C中。正式陈述问题并编写用于添加两个整数的伪代码。

解决方案:

  1. C←[1 ... n + 1]▹C为零填充。
  2. for i←1 to n
  3. 做总和←A [i] + B [i] + C [i]
  4. C [i]←sum%2
  5. C [i + 1]←sum /2▹整数除法。
  6. 输出C
  7. 问题:

    1. 我认为C [i]是A [i] + B [i]为什么要在步骤3中添加总和←A [i] + B [i] + C [i]?
    2. 为什么总和%2(为什么需要在步骤4中使用modulo?)
    3. 为什么sum / 2(为什么需要在步骤5中使用除法?)
    4. 请您用真实的例子解释上述解决方案吗?感谢。

3 个答案:

答案 0 :(得分:20)

C既是解决方案又是进位。对于一个真实的例子,让我们加上11 + 3.我将用二进制写入parens中的十进制数)

A = 1011 (11) + B = 0011 (3) [C starts as 00000 (0)]
       ^               ^                      ^

^ s标记第一个位置,然后我们向左走,因为我们从左到右阅读,但数学从右到左。另外,我们除了整数,所以3/2 = 1,而不是1.5。现在的步骤。

1. sum = 1+1+0 = 10 (2), c[1] = 2 % 2 = 0, c[2] = 2/2 = 1
2. sum = 1+1+1 = 11 (3), c[2] = 3 % 2 = 1, c[3] = 3/2 = 1
3. sum = 0+0+1 = 01 (1), c[3] = 1 % 2 = 1, c[4] = 1/2 = 0
4. sum = 1+0+0 = 01 (1), c[4] = 1 % 2 = 1, c[5] = 1/2 = 0
^        ^ ^ ^                               ^
i        A B C, all at position i            note that we store the carry for the NEXT step

结果:C = 01110(14)

答案 1 :(得分:5)

  1. 您还要添加C[i],因为C[i]可能包含您在上一次迭代中添加A[i-1] + B[i-1] + C[i-1]时的进位。例如,如果我们执行1 + 1,我们的第一次迭代sum = 1 + 1 + 0 = 2,但由于这是二进制,我们必须携带1并将其放在C[1]上并放入余数(2 % 2 = 0C[0]。这给了我们10
  2. C[i]获得总和%2,因为A[i] + B[i] + C[i]的总和可能大于1,但1是最适合该数字的数字。其余的总和(如果有的话)将被放入进位。这就把我们带到......
  3. C[i+1]被分配sum / 2,因为sum / 2是进位金额。当我们为A[i] + B[i] + C[i]执行i = i + 1时,它将在下一次迭代中使用。

答案 2 :(得分:5)

您可以考虑添加二进制数与添加基数10的方式相同:在每个数字处执行“添加”步骤和“进位”步骤。

所以,让我们一次数学一点。假设我们正在添加:

101
+
011

第一步,我们从最右边开始。 (在您的示例中,这对应于i = 1)。我们添加(1 + 1)%2,这给了我们0.这里到底发生了什么? 1 + 1是2,二进制是2位数(“10”)。我们只能写低位数字(“0”),所以表达总和“mod 2”实际上只是说“不要担心现在的结转总和”。所以我们得到了:

101
+
011
---
  0  (carrying a 1)

现在我们通过整数除法(“sum / 2”)实现“携带1”,并暂时存储它:

101
+
011
---
 10

现在我们准备添加第二个数字:(0 + 1)%2 - 但我们必须添加我们一直在跟踪的结转1,所以我们取(0 + 1 + 1)%2产生:

101
+
011
---
 00

我们再次需要跟踪进位,给我们(0 + 1 + 1)= 1:

101
+
011
---
100

最后我们添加第3位:(1 + 0 + 1)%2给出答案:

 101
 +
 011
 ---
1000