问题:
考虑将存储在两个 n 元素数组 A 和 B 中的两个 n 位二进制整数相加的问题。这两个整数的和应该以二进制形式存储在一个 (n + 1) 元素数组 C 中。正式地陈述问题并编写将两个整数相加的伪代码。
解决方法:
- C ← [1 ... n + 1] ▹ C 是零填充的。
- 对于 i ← 1 到 n
- 求和 ← A[i] + B[i] + C[i]
- C[i] ← 总和 % 2
- C[i + 1] ← 总和/2 ▹ 整数除法。
- 输出C
问题:
- 我认为 C[i] 是 A[i]+B[i] 为什么要在步骤 3 中添加 sum ← A[i] + B[i] + C[i]?
- 为什么 sum % 2 (为什么需要在第 4 步中使用模数?)
- 为什么是sum/2(为什么第5步要用除法?)
你能用实例解释一下上面的解决方案吗?谢谢。
C 既是解又是进位。举一个真实的例子,让我们加 11 + 3。我将用二进制写,括号中是十进制)
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)