algorithm - 请向我解释以下问题的解决方案

标签 algorithm math discrete-mathematics

<分区>

问题:

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

解决方法:

  1. C ← [1 ... n + 1] ▹ C 是零填充的。
  2. 对于 i ← 1 到 n
  3. 求和 ← A[i] + B[i] + C[i]
  4. C[i] ← 总和 % 2
  5. C[i + 1] ← 总和/2 ▹ 整数除法。
  6. 输出C

问题:

  1. 我认为 C[i] 是 A[i]+B[i] 为什么要在步骤 3 中添加 sum ← A[i] + B[i] + C[i]?
  2. 为什么 sum % 2 (为什么需要在第 4 步中使用模数?)
  3. 为什么是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)

关于algorithm - 请向我解释以下问题的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5610024/

相关文章:

c++ - C++ 循环中 vector 的性能

c++ - Rabin-Karp 中的滚动哈希

algorithm - 具有非均匀网格的matlab中的双积分

matlab - 计算球形斑 block 的表面积

java - 找到一个非零整数 x 其中 x == -x?

algorithm - 解决复发复发

c++ - 如何使用Trie数据结构查找所有可能子串的LCP总和?

java - 快速处理数组以进行波形渲染的方法

math - 在 3D 中使用三角函数计算距离

math - ∃是什么意思?