问题:
考虑添加两个n位二进制整数的问题,存储在两个n元素数组A和B中。两个整数之和应以二进制形式存储在(n + 1)元素数组C中。正式陈述问题并编写用于添加两个整数的伪代码。
解决方案:
问题:
请您用真实的例子解释上述解决方案吗?感谢。
答案 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)
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 = 0
)C[0]
。这给了我们10
C[i]
获得总和%2,因为A[i] + B[i] + C[i]
的总和可能大于1,但1是最适合该数字的数字。其余的总和(如果有的话)将被放入进位。这就把我们带到...... 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