Algorithm 有没有可能设计出一种不首先比较输入的减法算法?

Algorithm 有没有可能设计出一种不首先比较输入的减法算法?,algorithm,language-agnostic,subtraction,Algorithm,Language Agnostic,Subtraction,显然,任何有能力的编程语言都有内置的减法。然而,假设您需要实现一个定制的减法算法(比如,处理非常大的数字)。如果使用借用方法,则必须首先比较输入以确定结果是否为负,如果为负,则切换减法的顺序。我很好奇是否可以编写一个不需要这种比较/操作数交换的算法 此外,这种算法是否比“比较第一”(compare first)更有效?在最坏的情况下,compare first必须比较每个位置的值 *我知道可以使用补码,但这限制了允许输入的大小(假设表示大小有限)。如果您要实现bignums,那么您可以将比较和减

显然,任何有能力的编程语言都有内置的减法。然而,假设您需要实现一个定制的减法算法(比如,处理非常大的数字)。如果使用借用方法,则必须首先比较输入以确定结果是否为负,如果为负,则切换减法的顺序。我很好奇是否可以编写一个不需要这种比较/操作数交换的算法

此外,这种算法是否比“比较第一”(compare first)更有效?在最坏的情况下,compare first必须比较每个位置的值


*我知道可以使用补码,但这限制了允许输入的大小(假设表示大小有限)。

如果您要实现bignums,那么您可以将比较和减法结合起来,以便只查看一次,除了一次。(单词“limb”来自GNUMP库,但在其他地方也用于表示相同的意思。)

首先,从较长数字的大端开始扫描,直到找到一个非零分支或到达较小数字的长度。在第一种情况下,你知道越长的数字越大,你也知道它最重要的肢体的位置。(如果您采用了数字始终具有非零最高有效边的约定,则可以跳过此步骤。)

假设现在你没有证明长的数字更大,所以你知道在两个数字中都处于相同的位置。继续扫描两个数字,直到找到差异。在这一点上,您知道哪个数字更大,并且您还知道较大数字的最重要分支的位置

现在你知道哪个数字更大了,你可以从数字的低阶末端做正常的借用算法,当你到达你之前识别的高阶分支时停止

由于两次扫描在同一个位置停止,因此您不会多次查看任何肢体,请查看停止第一次扫描的高阶肢体



你必须决定是否真的值得实施这种黑客行为。这种复杂的情况可能是不合理的。但这是可能的。

这就是大整数减法在Squeak Smalltalk中的实现方式。它不会增加太多的复杂性。